Migration ATmega16 zu ATmega644

OP #2912669
Lesenswert?

Hallo,

ich bin noch Anfänger in Sachen Mikrocontroller. Versuche aber gerade 
eine Migration vom ATmega16 zum ATmega644(20 PU) mit 16MHz zu machen. 
Dabei bin ich mir aber nicht sicher ob ich alles richtig gemacht habe. 
Ich würde mich sehr freuen, wenn mir hierzu jemand helfen kann. Das 
gesamte migrierte Projekt wird zumindest ohne Fehler und Warnungen 
kompiliert. Kann ich davon ausgehen das somit alles stimmt?

In den Anhang habe ich die abgespeckten Quellen vom Original-Projekt und 
die meiner Migration gestellt.

Vielen Dank!

mfg pal
Angehängte Dateien:
#2918789
Lesenswert?

1
#define USART_RXC_vect    TIMER2_OVF_vect
2
#define USART_TXC_vect    TIMER1_COMPA_vect
3
#define UDR          UDR0
4
#define UDRE        UDRE0
5
#define UCSRA        UCSR0A
6
#define UCSRB        UCSR0B
7
#define UCSRC        UCSR0C
8
#define UBRRH        UBRR0H
9
#define UBRRL        UBRR0L
10
#define TXEN        TXEN0
11
#define UCSZ1        UCSZ01
12
#define UCSZ0        UCSZ00
13

14
...
15

16
ISR(USART_RXC_vect)
17

18
...

Da braucht man nicht lange nachsehen, um zu wissen das das nicht stimmt. 
Der Receive Interrupt heisst auch beim Mega644 ganz sicher nicht 
TIMER2_OFV_vect (Das ist der Overflow Interrupt vom Timer 2)

Vergiss die Migration.
Schreib ein Programm für den Mega644.
Du brauchst einfach immer nur im Hintrekopf halten, dass der 644 
offenbar 2 UARTS hat. Also muss in allem was mit dem UART zu tun hat 
entweder eine 0 oder eine 1 vorkommen, je nachdem welche der beiden 
UARTS gemeint ist. Also wird die ISR für den Receive Interrupt irgendwas 
in der Richtung
ISR( USART0_RXC_vect) heissen. Also prinzipiell wie die aus deiner 
Vorgabe vom Mega16, nur irgendwo steckt im Namen eine 0 drinnen, für die 
USART0.

Einfach mal ein wenig logisch nachdenken und weniger mechanisch 
arbeiten.
Moderator Persönliche Seite #2918856
Lesenswert?

Karl Heinz Buchegger schrieb:
> Du brauchst einfach immer nur im Hintrekopf halten, dass der 644
> offenbar 2 UARTS hat.

Der 644 selbst hat nur eine, allerdings haben der 644P und 644A
zwei.  Schräg, ich weiß.  (Der 644 ohne P war der erste der Familie,
danach hat man 324P/164P entworfen und diesen eine zweite USART
spendiert, die der 644P dann auch mit bekommen hat.)
OP #2922565
Lesenswert?

So... habe mal versucht logisch an die Sache heran zu gehen. Aber gerade 
bei dem Beispiel mit "USART0_RXC_vect" meldet der Compiler mir eine 
Warning "'USART0_RXC_vect' appears to be a misspelled signal handler"

Versteh momentan nicht was falsch sein soll.

Includiert sind die Files "#include <avr/io.h>" und "#include 
<avr/interrupt.h>"

@Spess: Danke für die Info. Hab mir die Seite im Datenblatt noch mal 
angesehen.
#2924117
Lesenswert?

Ich frag mich ja, was diese 'Migration' eigentlich bringen soll. Das 
Programm macht auf dem Mega16 nichts sinnvolles und das Migrierte macht 
auch nichts sinnvolles.

@TO
Tu dir selbst einen Gefallen und vergiss diesen ganzen Migrier-Schmarrn.
Schreib dein Programm auf dem 644, so wie man eben ein Programm 
entwickelt. Für die paar Dinge, die bisher benutzt werden (Timer, USART) 
siehst du ins Datenblatt und holst dir von dort die korrekten Bit- und 
Registerwerte. Und ansonsten schreibst du das alles so, wie man eben ein 
Programm entwickelt.


Um ein richtiges Programm zu migrieren, muss man nämlich schon wissen, 
was man tut. Da muss man BEIDE Prozessoren kennen, bzw. die Datenblätter 
dafür vor sich liegen haben. Du kennst offenbar nicht nicht mal einen.
OP #2924145
Lesenswert?

Sorry,.... "sei()" aktiviert Interrupts.

Aber wie gebe ich den Interrupt für RX frei? Ich bin Anfänger...

So?
1
UCSR0B |= (1 << TXEN0) | (1 << RXCIE);

Warum Migrier-Schmarrn? Ich dachte immer, dass man den Mega16 einfach 
auf den Mega644 umsetzen kann. Was stimmt denn nicht?

> Das Programm macht auf dem Mega16 nichts sinnvolles und das Migrierte
> macht auch nichts sinnvolles.

Doch... ich hatte eigentlich oben bemerkt, dass dieses Programm auf das 
Minimum heruntergebrochen ist. Es macht keinen Sinn etliche Zeilen 
Quellcode online zu stellen, die uninteressant sind.
#2924156
Lesenswert?

pal ... schrieb:

> Warum Migrier-Schmarrn?

Weil du fehlendes WIssen dadurch kompensierst, dass du irgendwo Code 
klaust ohne zu wissen was du tust.
Das funktioniert nicht.
Fehlendes Wissen wird durch 'lernen' wett gemacht und nicht durch Code 
klauen.

Die einzig richtige Antwort auf Spess Einwand wäre gewesen: Der 644-er 
COde verwendet den UART Interrupt (noch) nicht, genauso wie er auch im 
16-er Original still gelegt ist.
Das wäre die Antwort gewesen. Und die Tatsache das sie nicht gekommen 
ist, erzählt mir Bände.
Gast #2924161
Lesenswert?

Hi

>Aber wie gebe ich den Interrupt für RX frei? Ich bin Anfänger...
>So?
>UCSR0B |= (1 << TXEN0) | (1 << RXCIE);

Ja. Aber jetzt hast du den Empfänger nicht eingeschaltet. Lies mal im 
Datenblatt nach, was die Bits TXEN, RXEN, TXCIE und RXCIE bewirken.

MfG Spess
OP #2924248
Lesenswert?

@Karl Heinz:
> Weil du fehlendes WIssen dadurch kompensierst, dass du irgendwo Code
> klaust ohne zu wissen was du tust.
Stimmt nicht ganz! Ich habe den Code nicht geklaut.

Und ja, die UART Interrupt werden auch im Mega16 nicht durchlaufen.


@Spess: Danke, ich schau mir die Sachen trotzdem noch mal im Datenblatt 
an.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren