Ik heb een programma geschreven wat half werkt... Het is de bedoeling dat ik via de RX een 5-tal bytes inlees en dan de waardes van de middelste 3 overneem.

Dit gaat goed als ik de waardes 1 voor 1 verstuur, maar niet wanneer ik ze in een string zet. Wat kan ik fout doen? Of is de UART van de AVR niet op deze wijze van data ontvangen ingesteld?

Oja, mijn code natuurlijk. :)

En heb je al ontdekt WAT er dan fout gaat (of niet goed ;))

Ik zie niks bijzonders in je code wat kan leiden tot een fout. Het enigste wat ik mij kan bedenken is dat het fout gaat zodra je Timer een interrupt geeft tussen de string door. Je AVR zal dan in de Timer routine komen en daardoor niet reageren op de RS232 interrupt want die maskert hij zodra die al met een interrupt bezig is. Hierdoor zou die RS232 data kunnen missen.

Ik denk dat dit laatste ook het geval is, en hiervoor raad ik je aan om de Timer routine zo klein mogelijk te houden en de overige code in main te zetten. Zo zal de tijdsduur dat de AVR in de timerinterrupt zit tot een minimum worden beperkt. Zet dus alles wat in main kan in main ;)
En als ik dat zo zie hoeft je interrupt routine van de Timer alleen te bevatten:

"inc counter"

en meer niet!

Een gouden regel is altijd: "zorg dat je zo snel mogelijk weer uit een interrupt routine vandaan komt"

ik vind ook niks mis met je code. Het antwoord van Bastiaan lijkt mij ook de oplossing. Zet alles in je main program, behalve:


tmr0_ovf:
 inc    counter
 reti

Rx_byte:
 in	r_byte,	UDR
 reti

Ah, bedankt voor de reacties!

Die PWM code kan niet uit mijn timer routine. Ik zou dan weleens wat problemen met de PWM kunnen krijgen als ik andere dingen (zoals bytes bekijken) ga doen.

Die UART code zou er eventueel wel uit kunnen. Maar dan ben ik mijn controle kwijt over wanneer er een NIEUWE waarde in r_byte staat. Dus ook de statusupdate zou er in moeten komen.

Het is nu trouwens gelukt zonder enige code te wijzigen, met een in VB gebouwd programma kan ik met de functie transmitbyte (getal) gewoon de 5 bytes na elkaar sturen zonder pauzes er tussen. :)

Alleen vreemd dat ie met de test terminal niet goed doet...

Op 14 november 2003 20:05:40 schreef Benadski:
Het is nu trouwens gelukt zonder enige code te wijzigen, met een in VB gebouwd programma kan ik met de functie transmitbyte (getal) gewoon de 5 bytes na elkaar sturen zonder pauzes er tussen. :)

Als ik dit zo lees lijkt het wel of je een probleem had met het verzenden van een string, ipv zoals ik dacht met het ontvangen aan de AVR zijde.

Alleen vreemd dat ie met de test terminal niet goed doet...

Het is altijd lastig met terminal programma's en poorten. Het blijft altijd weer uitproberen en een beetje rotzooien wil je het werkend krijgen ;)

sbi UCR, RXEN ;UART activeren
ldi r16, 25 ;snelheid 9600 baud @ 4mhz xtal
out UBRR, r16