ATtiny2313 USART - konstig baudrate

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Om jag börjar main med:
DDRB = 0xFF;

så funkar det!
Nu används inte PORTB alls, och givetvis bör man sätta alla oanvända portar som output. Men det känns ändå långsökt att detta är lösningen?
Funkar gör det dock! (förutom att AVR:en just nu korkade helt å hållet - går inte att programmera om, suck!)

Mvh
speakman
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Inlägg av oJsan »

Jag hade samma problem här om dagen.. det ville inte funka. Tillslut så insåg jag att jag inte hade satt fuse-bitarna när jag gick från utvecklingsbordet till det egentillverkade kortet med en annan atmega (dock samma modell). Tidigare använde jag en extern kristall på 8Mhz men den nya atmega använde som default den interna oscillatorn på 1Mhz.
Jag kikade på den här sidan och fick till det på rätt sätt:
http://electrons.psychogenic.com/module ... OGuide.php
Börja med att läsa bitarna.. skriv ner dom på papper och kolla vilka du behöver ändra på. Är du osäker så står standardvärdena i databladed, dvs vilket värde de skulle ha "unprogrammed".
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Från första inlägget:
> där ser jag att bitlängderna är fantastiskt mycket längre (helt enormt, 20ms långa!!).

Notera att 20 ms = 50 Hz...

> givetvis bör man sätta alla oanvända portar som output. Men det känns ändå långsökt att detta är lösningen?

Inte alls...
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Inlägg av oJsan »

Enligt databladet så är det 0x64 som är default... vilket är intern RC-oscillator@8Mhz.
0x62 är mycket riktigt 4Mhz. Felet ligger nog någon annanstans. De 50Hz/20ms du mäter upp är nog mätbrum och inget som kommer från UART:en skulle jag tro...

Edit: Hur programmerade du fuse-bitarna för att få den att sluta fungera?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

50Hz nätbrum kan mycket väl "plockas upp" av öppna ingångar och
få en processor att göra vilka konstiga saker som helst, inklusive
att start om.
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

speakman skrev:Något som också förvirrar mig är varför inte UBRR går att använda? Den defineras ju i io2313.h och borde ju fungera. Om man läser io.h så läser den in ioXXXX.h beroende på vad som är definerat. Jag antar att dessa defineras av kompilatorn m.h.a. --mmcu
Det kan nog bero på att UBRRH och UBRRL inte ligger bredvid varandra i minnet, och att det därför inte går att köra med UBRR bara. Gissar att det är så iaf. Sen är den iotn2313.h du ska kolla i, inte io2313.h.

Tiny2313 kör med 8 MHz-oscillator med en delare på 8 som standard, dvs 1 MHz. Sätt CKDIV8 till 1 för att inte dela med 8.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Tack för allt engagemang, för det första!

Sodjan:
Har inte kollat AVR, men 8051:orna jag kört rekommenderas att antingen sätta NC pins till Output, eller dra dom till jord. Låter rimligt, varav det borde gälla för samtliga uC:er, mitt tycke.

Vad det gäller nätbrum, så borde inte nätbrummet vara exakt fyrkantsvåg, och rätta sig efter vilken byte som skickas på serieporten. ;)
Dessutom så blir det rätt om jag byter programvara i uC:n. Med exakt samma koppling.
Den enda skillnaden som det visade sig vara, är just de att portarna sätts till utgångar direkt i början. Bevisligen så fungerar det, men jag uppfattar det fortfarande som långsökt. :)

Ang. fusebitarna så har jag aldrig skrivit dom (eller för länge sedan), utan dom är fortfarande som dom alltid varit.

En sidofråga: Är det ofarligt att köra den på interna RC-osc @ 8MHz? Det pratas om problem med startup-tider i databladet, man kanske måste ändra "SUT0" och "SUT1" för att kompensera?

Mvh
speakman
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

cykze:
Du har helt rätt ang. header-filen! Jag har tittat i fel fil hela tiden. :)
UBRR finns inte definerad i "rätt" fil.0
The CKDIV8 Fuse determines the initial value of the CLKPS bits. If CKDIV8 is unprogrammed,
the CLKPS bits will be reset to 0000. If CKDIV8 is programmed, CLKPS bits
are reset to 0011, giving a division factor of 8 at start up.
Menar du "sätt till 0"? F.ö. så är den _inte_ satt som den är programmerad nu (0x64).

Mvh
speakman
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Nej, du ska sätta den till 1 för att få den "unprogrammed", dvs utan någon delning av klockfrekvensen.

0 - Programmed
1 - Unprogrammed

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

Inlägg av sodjan »

> ...rekommenderas att antingen sätta NC pins till Output, eller dra dom till
> jord. Låter rimligt, varav det borde gälla för samtliga uC:er, mitt tycke.

Gäller alla **CMOS** kretsar, inte bara uC:er...

> Ang. fusebitarna så har jag aldrig skrivit dom (eller för länge sedan),
> utan dom är fortfarande som dom alltid varit.

Det viktiga måste väl vara att du förstår hur dom är satta och att du
är helt övertygad om att dom är rätt satta för din applikation.
*HUR* dom blev satta som de är, är mindre intressant...

> Vad det gäller nätbrum, så borde inte nätbrummet vara exakt fyrkantsvåg,...

Nej, och det är det inte på *ingångarna*, vilket är själva problemet.
Ingångarna kommer att pendla fram och tillbaka i olika mellanlägen
mellan "1" och "0" och orsaka olika (oönskade) fenomen i CMOS
ingångsstegen, främst onormalt hög strömförbrukning.

> och rätta sig efter vilken byte som skickas på serieporten.

Du kör utanför spec, och det finns ingen möjlighet att säga vad som ska
eller inte ska hända.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

sodjan:
När byten på scopemetern stämmer exakt med den byte serieporten skickar, så *borde* det betyda att det fungerar. Det var så jag resonerade. :D

cykze:
Jag tvivlar inte på vad du säger, du verkar onekligen kunna AVR. Men det jag förundras över är att det i mitt fall stämmer exakt med den tänkta baudraten (efter att ha satt pinnarna till utgångar då förstås), trots att den borde gå en åttondels hastighet?

Ett annat USART-problem är att den vägrar sten att ta in tecken! Mäter upp med scopemetern, och det ser OK ut.
Ska testa sätta DIV8-biten också, men måste göra om koden lite först. :)

Mvh
speakman
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

För att se ungefär vilken frekvens AVR:en kör på så gör du ett program som "växlar" en lysdiod en gång per sekund vid t ex 8 MHz. Sen kollar du med ett tidtagarur hur lång tid det är i mellan. Är det en sekund så är det 8 MHz. Är det två sekunder är det 4 MHz osv.

Lite kod som du kan testa. Tiden mellan en växling, alltså från släckt till tänd eller tvärtom, ska ta en sekund vid 8 MHz. Ta tid!

Det är ju en fördel om man har räknat rätt i koden också, men det bör stämma...

Kod: Markera allt

#include <inttypes.h>
#include <avr/io.h>
#include <avr/delay.h>

int main()
{
	uint8_t i;

	DDRB = _BV(PB0);

	while (1)
	{
		PORTB ^= _BV(PB0);

		for (i=0; i<40; i++) // Gör 40 st delay-anrop
			_delay_loop_2(50000); // Väntar 50000*4 klockcykler
	}

	return 0;
}
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Alldeles riktigt går processorn betydligt snabbare nu. Kör ett antal timrar o dyl. i den övriga koden (styr en R/C-servo), och det märktes direkt skillnad. Fick helt enkelt skala upp allt 8ggr. :)
Men jag förundras fortfarande hur baudraten kunde stämma tidigare?
Har dessvärre inte haft tid att kolla upp den hur den fungerar nu. Får ta det vid ett senare tillfälle.

Mvh
speakman
Skriv svar