Jobbar med en Atmega 324PB och ska få ett startbyte på UART0 att väcka upp uP och skicka det vidare till UART1. Efter 15 ms kommer mer data. Det kan ibland komma skräp och det ska också lotsas vidare.
Nu låter jag uP gå ner i power-down och där ligger den tills ett IRQ från Frame-detect kommer MEN jag tycks inte få ur datat ur det bytet.
Vad är det för fel?? Har provat lite olika metoder. Använde mig av IRQ-RXC men den tycktes inte hitta första väcka-upp bytet. Sen tog jag bort Irq-RXC och ersatte den med en pollning.
Det funkade inte heller.
Givetvis funkar allt när jag tar bort sleep. Så jag misstänker nån form av startup problem. Jag har noterat att IRQ Frame Detect kommer ca 0.5ms efter sista biten i startupbytet.
När jag inte har sleep så kommer denna IRQ nån bit in i bytet.
Var kan jag leta? Fuses? Är det problemet?
Har extern oscillator på 16M. Använder inte extern klocka eller nåt. Använder en timer som prescalas ner med 1024. Den stängs av under sleep.
Tacksam för tips.
problem med Atmega 324PB, IRQ UART Frame Detect
Re: problem med Atmega 324PB, IRQ UART Frame Detect
Det låter som du försöker använda UART:en med klockan till den avstängd?
Ett trick kan ju vara att ha pin-changeinterrupt på uart-pinnen, vakna på det och sen köra uart. Men då missar man minst en byte antar jag,
så det bygger på att det kommer flera wakeup-bytes.
MVH: Mikael
Ett trick kan ju vara att ha pin-changeinterrupt på uart-pinnen, vakna på det och sen köra uart. Men då missar man minst en byte antar jag,
så det bygger på att det kommer flera wakeup-bytes.
MVH: Mikael
Re: problem med Atmega 324PB, IRQ UART Frame Detect
Som jag kan förstå manualen så triggar Frame-Detect på start-syncen, dvs, när ena tråden går låg för att inleda en comm. I min okunskap trodde jag då att den drog igång nödvändiga klockor och klockade in bytet.
Jag har också på känn att det behövs fler startbyten men det blir svårare och sämre konstruktion. Jag kanske får acceptera att första startbytet går förlorat och själv lägga på 0x55+vänta 15 ms för att lotsa vidare datat som kommer (typ 20 byten).
Jag har också på känn att det behövs fler startbyten men det blir svårare och sämre konstruktion. Jag kanske får acceptera att första startbytet går förlorat och själv lägga på 0x55+vänta 15 ms för att lotsa vidare datat som kommer (typ 20 byten).
Re: problem med Atmega 324PB, IRQ UART Frame Detect
Summering:
Det visade sig vara den externa kristallen som gjorde att baudrategeneratorn hade svårt att klocka in datat under ca. 18 ms. Jag vet ärligt talat inte varför det blir sååå lång tid. Manualen säger 16kCL vilket betyder 1 ms.
Jag bytte till Interna 8Meg klockan. Då först fungerade det. Start frame funkar. Första bytet (som aktiverar Start-irq) kommer också in rätt (rxc-irq).
Det visade sig vara den externa kristallen som gjorde att baudrategeneratorn hade svårt att klocka in datat under ca. 18 ms. Jag vet ärligt talat inte varför det blir sååå lång tid. Manualen säger 16kCL vilket betyder 1 ms.
Jag bytte till Interna 8Meg klockan. Då först fungerade det. Start frame funkar. Första bytet (som aktiverar Start-irq) kommer också in rätt (rxc-irq).
Re: problem med Atmega 324PB, IRQ UART Frame Detect
Om kristallen slutar oscillera under väntan tar det en viss tid att få oscillatorn att svänga, detta delvist pga. kristallens låga bandbredd.
Man kan lösa det vid att byta till en keramisk resonator som startar mycket snabbare.
Man kan lösa det vid att byta till en keramisk resonator som startar mycket snabbare.
Re: problem med Atmega 324PB, IRQ UART Frame Detect
Sniffa vid kristallen med något bra instrument, gissningsvis kommer du att se att den tar tid på sig att svänga ordentligt.
En variant är att inte stänga av kristalloscillatorn, om man har råd med det.
En variant är att inte stänga av kristalloscillatorn, om man har råd med det.
Re: problem med Atmega 324PB, IRQ UART Frame Detect
Ska absolut titta på Keramisk Resonator.
Nej, tyvärr kostar det för mkt att ha kristallen gående. Troligtvis slutar det med att vi designar in en OSC avsedd för att driva baudrategeneratorn.
En lite undran här; vilken OSC man ska välja? Jag menar, uart använder ju nån logik som samplar varje bit ett antal gånger för att avgöra dess värde. Låt oss säga 16 gånger per bit. Om jag då (i vissa lägen kör jag 38.4 kbps) så blir det ju minimum 1MHz som OSC. Jag måste läsa 324PB.pdf lite mer.
Nej, tyvärr kostar det för mkt att ha kristallen gående. Troligtvis slutar det med att vi designar in en OSC avsedd för att driva baudrategeneratorn.
En lite undran här; vilken OSC man ska välja? Jag menar, uart använder ju nån logik som samplar varje bit ett antal gånger för att avgöra dess värde. Låt oss säga 16 gånger per bit. Om jag då (i vissa lägen kör jag 38.4 kbps) så blir det ju minimum 1MHz som OSC. Jag måste läsa 324PB.pdf lite mer.