Sida 1 av 1
bit banging
Postat: 24 maj 2009, 19:41:59
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??
Re: bit banging
Postat: 24 maj 2009, 19:43:10
av Swech
Vart är programmet då?
Swech
Re: bit banging
Postat: 24 maj 2009, 19:45:44
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.
Re: bit banging
Postat: 24 maj 2009, 19:59:35
av Swech
Eländigt sätt att bitbanga på...
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
Re: bit banging
Postat: 24 maj 2009, 20:10:23
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å??
Re: bit banging
Postat: 24 maj 2009, 20:14:08
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
Re: bit banging
Postat: 24 maj 2009, 20:21:48
av sodjan
Sluta omedelbant att posta kod utan code-taggarna !
Det ser fördjävligt ut och är mer eller mindre oläsligt...
Re: bit banging
Postat: 24 maj 2009, 20:46:57
av Icecap
Finns det någon anledning att bit-banga? Varför inte använda den inbyggda UART?
Re: bit banging
Postat: 24 maj 2009, 20:47:52
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
Re: bit banging
Postat: 24 maj 2009, 21:50:12
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...
[/code]
Re: bit banging
Postat: 25 maj 2009, 15:48:27
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.
Re: bit banging
Postat: 25 maj 2009, 18:53:31
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!
Re: bit banging
Postat: 25 maj 2009, 19:01:54
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.
Re: bit banging
Postat: 25 maj 2009, 20:23:36
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 ?