Forum: Mikrocontroller und Digitale Elektronik Migration ATmega16 zu ATmega644


von Pal .. (pal)


Angehängte Dateien:

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

von Pal .. (pal)


Lesenswert?

Kann mir keiner sagen ob die Migration richtig ist?

von Karl H. (kbuchegg)


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.

von Pal .. (pal)


Lesenswert?

Hallo,

danke für deine Antwort!
Ich habe mich (versucht) an die Migrationsdoku von Atmel zu halten. Aber 
dann wohl ohne großen Erfolg. Werde mich einfach noch mal, wie du schon 
sagst, logisch daran geben.

Danke!!!!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.)

von Pal .. (pal)


Lesenswert?

Danke Jörg für die Erklärung!
Da ich den ATmega644(20 PU) nutze muss ich doch als MCU-Type den 
"ATmega644P" wählen, oder?

von spess53 (Gast)


Lesenswert?

Hi

>Da ich den ATmega644(20 PU) nutze muss ich doch als MCU-Type den
>"ATmega644P" wählen, oder?

Nein. PU Steht für das Gehäuse ->PDIP.

MfG Spess

von Pal .. (pal)


Lesenswert?

Hab mich schon gefragt für was dies steht. Was bedeutet denn die 20?

von Willi (Gast)


Lesenswert?

pal ... schrieb:
> Hab mich schon gefragt für was dies steht. Was bedeutet denn die 20?

Hast Du kein Datenblatt?

von Pal .. (pal)


Lesenswert?

Doch.... nur leider weiß ich nicht was mir die 20 sagen soll.

von Thomas E. (thomase)


Lesenswert?

pal ... schrieb:
> 20
MHz

mfg.

von Pal .. (pal)


Lesenswert?

man lernt doch immer etwas dazu.... danke!

von Spess53 (Gast)


Lesenswert?

Hi

>Doch.... nur leider weiß ich nicht was mir die 20 sagen soll.

Steht im Datenblatt unter 'Ordering Infomation' oder so ähnlich.

MfG Spess

von Pal .. (pal)


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.

von Pal .. (pal)


Lesenswert?

Hab es gerade gefunden....

So "USART0_RX_vect" sollte es richtig sein

von Pal .. (pal)


Angehängte Dateien:

Lesenswert?

Im Anhang ist noch mal die überarbeitete Migration. Hab ich alles 
richtig gemacht?

von Pal .. (pal)


Lesenswert?

Hat jemand noch eine Idee zur Migration?

von spess53 (Gast)


Lesenswert?

Hi

>Hat jemand noch eine Idee zur Migration?

>ISR(USART0_RX_vect)

Der Interrupt für RX wird in der USART-Init nicht freigegen.

MfG Spess

von Pal .. (pal)


Lesenswert?

Das passiert aber doch in der init().
1
void init()
2
{
3
....
4
  sei();
5
}

Oder habe ich dich falsch verstanden?

von hui (Gast)


Lesenswert?

pal ... schrieb:
> Das passiert aber doch in der init().void init()
> {
> ....
>   sei();
> }

Nein.

pal ... schrieb:
> Oder habe ich dich falsch verstanden?

Was kann man an dem spess53 post falsch verstehen?

Was macht den sei(); ?

von Karl H. (kbuchegg)


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.

von Pal .. (pal)


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.

von Uwe (Gast)


Lesenswert?

>   sei();
Gibt GLOBAL die Interupts frei, jeder einzelne Interupt hat jedoch 
zusätzlich sein eigenes Inetrupt enable Bit im IO-Register 
Adressbereich.

von Karl H. (kbuchegg)


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.

von Pal .. (pal)


Lesenswert?

Danke Uwe für die Info.

Dann doch mit
1
(1 << RXCIE0)
?

von spess53 (Gast)


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

von Pal .. (pal)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.