AVR Code Portierung ATmega328P ATmega8

Gast #4414458
Lesenswert?

Hallo,
ich versuche gerade Code, der eigentlich für den atmega328p 
konzeptioniert wurde auf einen atmega8 zu portieren. Ich hänge nur noch 
an einer Stelle:
1
PCMSK0 |= (1 << PCINT0);

Nach dem Datenblatt wälzen komme ich zum Schluss, dass der atmega8 diese 
funktion (oder so ähnlich) nicht unterstütz.
Gehe ich recht in der Annahme, dass ich mit diesem Register steuern 
kann, dass ein Interrupt nur auftritt, wenn eine Änderung am PIN PB0 
auftritt? und die anderen Ports ignoriert werden?

Wie kann ich diese Codezeile auf den atmega8 portieren?

Danke
Gast #4414562
Lesenswert?

Frank M. schrieb:
> -.-.- schrieb:
>> Ich weiß das es ein atmega8 ist.
>
> Ist dieser durch den moderneren ATmega88 ersetzbar?
>
> Dieser ist pinkompatibel zum uralten ATmega8, aber sonst kompatibel mit
> dem ATmega328. Dann wärest Du sofort aus dem Schneider.

Das hat weniger mit dem "ersetzbar" zu tun. Ich hab den ATmega328p mehr 
als Entwicklungsplattform genutzt, da der ATmega8 verbaut ist. Auf dem 
wollte ich den Code laufen lassen, da ich damit, im besten Fall nicht 
alle ATmega8 durch ATmega328 tauschen muss (TQFP 32).

Das bringt mich zurück zu meiner Anfangsfrage:
Kann ich
1
PCMSK0 |= (1 << PCINT0);

durch was auf dem atmega8 ersetzen? Oder muss ich das in der ISR machen?
#4414568
Lesenswert?

Hallo,

Der Mega8 kennt keinen PinChange-IRQ wie schon angemerkt.
Du kannst es so nicht ersetzen, weil die Hardwarefunktion existiert.
Ob Du es generell durch andere Programmierung erstezn kannt, hängt von 
Deinen Absichten, Deiner Hardware usw. ab, die wir nicht kennen.

PS: warum entwickelt man für einen Mega8 mit einem Mega328 ohne sich 
über die Unterschiede zu informieren?
Warum stellt man beim Entwickeln nicht wenigstens ab und zu den Mega8 
als Prozessor ein und läßt den Kram mal compilieren?

Gruß aus Berlin
Michael
#4414570
Lesenswert?

@-.-.- (Gast)


>Das bringt mich zurück zu meiner Anfangsfrage:
>Kann ich

>PCMSK0 |= (1 << PCINT0);

>durch was auf dem atmega8 ersetzen? Oder muss ich das in der ISR machen?

Diese Funktion kann man mit INT0 oder INT1 nachbauen, dazu muss man aber 
ein anderes Pin und einen anderen Interrupt nutzen. Ausserdem 
funktioniert das auf dem ATmega8 nicht im tiefen Sleep Mode wie 
Power Save oder Power Down, weil dann die Takte nicht laufen. Bei Active 
oder Idle geht es.
Gast #4414573
Lesenswert?

-.-.- schrieb:
> durch was auf dem atmega8 ersetzen? Oder muss ich das in der ISR machen?

Du kannst das nicht einfach "ersetzen". Du müsstest dann deinen Code 
soweit anpassen das er einen der Ext-Int Pins an PD2/3 nutzt. Wir alle 
kennen ja den dazugehörigen Code nicht, inweit dieser auf steigende oder 
fallende Flanken reagiert oder beides. Wie gesagt - du musst dann die 
ganze ISR von Pin-Change-Int zu Ext-Int umstellen / schreiben. Oooooder, 
du nutzt halt keinen Atmega8 sondern einen 88er der ist Pin sowie 
Softwarekompatibel zum 8 als auch zum 328.
Gast #4414612
Lesenswert?

Falk B. schrieb:
> @-.-.- (Gast)
>
>>Das bringt mich zurück zu meiner Anfangsfrage:
>>Kann ich
>
>>PCMSK0 |= (1 << PCINT0);
>
>>durch was auf dem atmega8 ersetzen? Oder muss ich das in der ISR machen?
>
> Diese Funktion kann man mit INT0 oder INT1 nachbauen, dazu muss man aber
> ein anderes Pin und einen anderen Interrupt nutzen. Ausserdem
> funktioniert das auf dem ATmega8 nicht im tiefen Sleep Mode wie
> Power Save oder Power Down, weil dann die Takte nicht laufen. Bei Active
> oder Idle geht es.

Erzähl mehr davon lechz

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