bit banging

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Stene
Inlägg: 276
Blev medlem: 13 maj 2008, 19:21:52
Ort: Uppsala

bit banging

Inlägg av Stene »

Hej!
Jag har en demo kod som är skriven till pic 16f628. Där använder vi bit banging som skickar över text o variabel till uart-tool
som finns i Pickit 2. Vi kör pic:en på 4mhz och det fungerar perfekt men nu måste vi höja frekvensen i pic:en. Vi har tänkt att höja till 20 mhz. Problemet är då att överföringen slutar att fungera, och det borde vara att det inte är rätt inställning på bit bangingen. Vi kör med en Baudrate´s på 9600 bit/sek. Inställningarna i programmet är att på getchar "delay 1,5 bit 159 sec at 4 mhz", putchar "delay one bit 104 usec at 4 mhz". Jag har tittat i databladet men jag lyckas inte begripa hur jag ändrar inställningarna. Är det någon vänlig själ som vill hjälpa mig med det??
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4750
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: bit banging

Inlägg av Swech »

Vart är programmet då?

Swech
Stene
Inlägg: 276
Blev medlem: 13 maj 2008, 19:21:52
Ort: Uppsala

Re: bit banging

Inlägg av Stene »

Kod: Markera allt

bit putchar( char ch )  /* sends one char */
{
  char bitCount, ti;
  if(ch == '\0') return 0; /* refuse to send 0 "end of string" */
  PORTB.7 = 0; /* set startbit */
  for ( bitCount = 10; bitCount > 0 ; bitCount-- )
   {
     /* delay one bit 104 usec at 4 MHz       */
     /* 5+18*5-1+1+9=104 without optimization */ 
     ti = 18; do ; while( --ti > 0); nop(); 
     Carry = 1;     /* stopbit                    */
     ch = rr( ch ); /* Rotate Right through Carry */
     PORTB.7 = Carry;
   }
  return 1; /* done */
}

char getchar( void )  /* recieves one char, blocking */
{
   /* One start bit, one stop bit, 8 data bit, no parity = 10 bit. */
   /* Baudrate: 9600 baud => 104.167 usec. per bit.                */
   char d_in, bitCount, ti;
   while( PORTB.6 == 1 ) /* wait for startbit */ ;
      /* delay 1,5 bit 156 usec at 4 MHz         */
      /* 5+28*5-1+1+2+9=156 without optimization */
      ti = 28; do ; while( --ti > 0); nop(); nop2();
   for( bitCount = 8; bitCount > 0 ; bitCount--)
       {
        Carry = PORTB.6;
        d_in = rr( d_in);  /* rotate carry */
         /* delay one bit 104 usec at 4 MHz       */
         /* 5+18*5-1+1+9=104 without optimization */ 
         ti = 18; do ; while( --ti > 0); nop(); 
        }
   return d_in;
}

 
Sorry! glömd det.
Senast redigerad av Stene 25 maj 2009, 19:06:12, redigerad totalt 1 gång.
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4750
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: bit banging

Inlägg av Swech »

Eländigt sätt att bitbanga på... :D

Prova att ta
ti *2.5 -> 45 vid första definitionen
och
ti*2.5 -> 70 vid andra...

Sen får man säkert finjustera med någon nop här och där

Swech
Stene
Inlägg: 276
Blev medlem: 13 maj 2008, 19:21:52
Ort: Uppsala

Re: bit banging

Inlägg av Stene »

OK är det så här du menar eller har jag förståt dig fel!

Kod: Markera allt

  
bit putchar( char ch )  /* sends one char */
{
  char bitCount, ti;
  if(ch == '\0') return 0; /* refuse to send 0 "end of string" */
  PORTB.7 = 0; /* set startbit */
  for ( bitCount = 10; bitCount > 0 ; bitCount-- )
   {
     /* delay one bit 104 usec at 4 MHz       */
     /* 5+18*5-1+1+9=104 without optimization */ 
     ti = 18; do ; while( --ti*2,5 >70); nop(); 
     Carry = 1;     /* stopbit                    */
     ch = rr( ch ); /* Rotate Right through Carry */
     PORTB.7 = Carry;
   }
  return 1; /* done */
}

char getchar( void )  /* recieves one char, blocking */
{
   /* One start bit, one stop bit, 8 data bit, no parity = 10 bit. */
   /* Baudrate: 9600 baud => 104.167 usec. per bit.                */
   char d_in, bitCount, ti;
   while( PORTB.6 == 1 ) /* wait for startbit */ ;
      /* delay 1,5 bit 156 usec at 4 MHz         */
      /* 5+28*5-1+1+2+9=156 without optimization */
      ti = 28; do ; while( --ti*2,5 >45 ); nop(); nop2();
   for( bitCount = 8; bitCount > 0 ; bitCount--)
       {
        Carry = PORTB.6;
        d_in = rr( d_in);  /* rotate carry */
         /* delay one bit 104 usec at 4 MHz       */
         /* 5+18*5-1+1+9=104 without optimization */ 
         ti = 18; do ; while( --ti*2,5 >70); nop(); 
        }
   return d_in;
}

Hur får ni ut att det ska vara så??
Senast redigerad av Stene 25 maj 2009, 19:07:27, redigerad totalt 1 gång.
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4750
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: bit banging

Inlägg av Swech »

Nej.....

Kod: Markera allt

/* delay one bit 104 usec at 10 MHz */
ti = 45; do ; while( --ti > 0); nop(); 

Kod: Markera allt

/* delay 1,5 bit 156 usec at 10 MHz */
ti = 70; do ; while( --ti > 0); nop(); nop2();
Swech
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: bit banging

Inlägg av sodjan »

Sluta omedelbant att posta kod utan code-taggarna !
Det ser fördjävligt ut och är mer eller mindre oläsligt...
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: bit banging

Inlägg av Icecap »

Finns det någon anledning att bit-banga? Varför inte använda den inbyggda UART?
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4750
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: bit banging

Inlägg av Swech »

Stene
Lägg in koden mellan
[ code ] (utan mellanslag)
din kod här
[ /code ]

Det finns en knapp för detta då du skriver meddelande

Swech
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: bit banging

Inlägg av sodjan »

> Lägg in koden mellan
> [ code ] (utan mellanslag)
> din kod här
> [ /code ]

Som sagt, använd gärna code-taggar när du postar kod
så slipper du skriva om taggarna... :-)

Kod: Markera allt

[code]
din kod här
[/code]
Användarvisningsbild
treton
Inlägg: 57
Blev medlem: 15 oktober 2008, 10:34:21
Ort: Solna

Re: bit banging

Inlägg av treton »

Syftet med bitbang och PICKit2 är att man slipper flytta PICKit2-programmeraren. Man kan då programmera och sedan köra debugutskrifter (bitbangade) via PICKit2 utan att behöva flytta pucken.

Jag tycker man ska investera i en RS232 TTL-USB från ELFA (73-206-73) och använda den integrerade serieenheten i PIC:en.
Stene
Inlägg: 276
Blev medlem: 13 maj 2008, 19:21:52
Ort: Uppsala

Re: bit banging

Inlägg av Stene »

Hej!
Nu har jag försökt att få det att fungera men jag har inte lyckats fått det funka. Jag har ökat " ti " men det vill sig inte. Har provat på 10 mhz och 20 mhz. Fins det något sätt att räkna det på?? Har även provat att lägga in flera nop men där vet jag inte vad jag gör!! gissar mig fram bara utan resultat.

Anledningen att jag kör den över pickit 2 är att jag provar mig väldigt mycket fram så på det här sättet går det rätt bra. ändra i koden o prova av den går rätt fort.

Jag viste inte det där med code-taggarna!! Nu vet jag det o om jag skriver något mer använder jag dom.
Jag är väldig ny med det här!
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: bit banging

Inlägg av vfr »

Jag viste inte det där med code-taggarna!! Nu vet jag det o om jag skriver något mer använder jag dom.


Det är inte försent ännu. Det är ju skitenkelt att lägga till på redan gjorda inlägg. Jag skulle tro att det klart ökar dina chanser att få vettiga svar. Som det ser ut nu så tror jag många tröttnar innan man kommit till kärnan.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: bit banging

Inlägg av sodjan »

Har du kört simulering (eller kollat ASM koden) för dina
programvaru-delays i C-koden ? Eller känner du dig
väldigt säker i alla fall att de är OK ?
Skriv svar