Forum: Mikrocontroller und Digitale Elektronik INT0 auf attiny441 zum laufen bringen


von Marlin (Gast)


Lesenswert?

Ich versuche gerade INT0 auf dem Atttiny441 zum laufen zu bringen, 
bekomme das aber nicht so zum laufen wie erwartet.

Mein Code sieht so aus:
1
    DDRB &= ~(1<<DDRB1);
2
3
    MCUCR |= ((1<<ISC01)|(1<<ISC00));      
4
    GIMSK  = (1<<INT0);    
5
    sei();
6
7
ISR(INT0_vect)
8
{
9
   // toggle led for debugging
10
}

Testsignal am Eingang B1 hab ich mir mit dem Scope angesehen, das ist 
ok. Mit einer while(1) Testschleife kann ich Port B1 auch auslesen und 
die LED toggeln. Versuche ich das über die Interruptroutine oben, dann 
passiert leider nichts. Sieht da jemand da einen Fehler in der Source, 
bin da gerade etwas betriebsblind.

von Karl M. (Gast)


Lesenswert?

Hallo,

das ist doch kein vollständiges Programm.
Wo sind die Include Dateien und die void main (...);?
Input einlesen und LED ausgeben, wo finde ich das?

von S. Landolt (Gast)


Lesenswert?

Zum ATtiny441 kann ich nichts sagen, aber beim ATtiny44 heißt der Vektor 
'EXT_INT0_vect' (warum auch immer).

von Marlin (Gast)


Lesenswert?

#include <avr/io.h>
#include <avr/interrupt.h>

int main() mit einer for(;;) {} ist der Rest, auf den ich es für die 
Tests reduziert habe.

Ich habe gerade entdeckt, daß es anscheinend ein Fehler von meiner GCC 
Toolchain ist. Wenn ich es unter Atmel Studio compiliere, geht es.
Ist die Interruptinitialisierung aus Eurer Erfahrung korrekt?

von klagge (Gast)


Lesenswert?

Marlin schrieb:
> Ist die Interruptinitialisierung aus Eurer Erfahrung korrekt?

Schreib erst mal ein paar Kommentare in den Code, sonst ist das nicht 
eindeutig zu beantworten.

von Carl D. (jcw2)


Lesenswert?

Marlin schrieb:
> Ich versuche gerade INT0 auf dem Atttiny441 zum laufen zu bringen,
> bekomme das aber nicht so zum laufen wie erwartet.
>
> Mein Code sieht so aus:
>
1
>     DDRB &= ~(1<<DDRB1);
2
>
>

Am Ende soll DDRB.1 gesetzt sein, also Schau dir obige Zeile noch mal 
intensiv an.

von S. Landolt (Gast)


Lesenswert?

> Am Ende soll DDRB.1 gesetzt sein

?
PB.1 ist der Interrupteingang für INT0.

von Carl D. (jcw2)


Lesenswert?

S. Landolt schrieb:
>> Am Ende soll DDRB.1 gesetzt sein
>
> ?
> PB.1 ist der Interrupteingang für INT0.

Stimmt. So ist es, wenn man Texte zu rudimentär liest ;-)

Bleibt noch die Fragen:
Wie wurde der Fehler erkannt?
Welcher PortPin sollte etwas tun?
Wie wurde der initialisiert.

Bei dem (kumulierten) geposteten Code würde ich keine außen erkennbare 
Reaktion des Chips erwarten.

von c-hater (Gast)


Lesenswert?

S. Landolt schrieb:
>> Am Ende soll DDRB.1 gesetzt sein
>
> ?
> PB.1 ist der Interrupteingang für INT0.

Genau: der springende Punkt ist hier: EINGANG. Dass Bit sollte also 
gelöscht sein. Und genau das stellt der von Carl inkrimierte Ausdruck 
wirklich sicher.

Da steckt der Fehler also ganz sicher nicht.

von HildeK (Gast)


Lesenswert?

Karl M. schrieb:
> Wo sind die Include Dateien und die void main (...);?

Wenn die fehlen würden, dann hätte es von Errors nur so gehagelt.
BTW: void main() meckert mein Compiler immer an, er will int main(), 
obwohl kein return x im Programm steht. WinAVR-20100110.

S. Landolt schrieb:
> Zum ATtiny441 kann ich nichts sagen, aber beim ATtiny44 heißt der Vektor
> 'EXT_INT0_vect' (warum auch immer).

Das 'Warum' hatte ich schon mal gefragt - ohne schlüssiges Ergebnis. War 
aber nur beim 44A, der 44 kennt INT0_vect. 
Beitrag "INT0 IRQ beim Tiny44A vs. Tiny44 (WINAVR-20100110 )"
Aber auch das hätte einen Error zur Folge gehabt.

Aber das Problem lag ja an anderer Stelle.

S. Landolt schrieb:
>> Am Ende soll DDRB.1 gesetzt sein
>
> ?
> PB.1 ist der Interrupteingang für INT0.

Ja, das war offenbar nur ein Programmausschnitt, bei dem der LED-Pin gar 
nicht genannt wurde. Warum muss man die Leute immer wieder darauf 
hinweisen, einen vollständigen Code zu posten, der den Fehler enthält?

von S. Landolt (Gast)


Lesenswert?

> ... aber nur beim 44A, der 44 ...

So tief bin ich nicht eingestiegen, ich verließ mich auf die 
Interruptvektorentabelle von Microchip, und dort finde ich weder 441 
noch 44A, sondern nur 44 mit 'EXT_INT0_vect'.

von HildeK (Gast)


Lesenswert?

S. Landolt schrieb:
> ich verließ mich auf die
> Interruptvektorentabelle von Microchip, und dort finde ich weder 441
> noch 44A, sondern nur 44 mit 'EXT_INT0_vect'.

Den 441 habe ich auch nicht angeschaut.
Das Problem war aber nicht die Bezeichnung im Datenblatt von Microchip 
(beide waren mit INT0 angegeben), sondern in den Headerdateien der 
üblichen Compiler. Ich habe bei mehreren geschaut, weil meiner ja schon 
älter ist - überall gleich. Da war für den 44 sowohl INT0_vect als auch 
EXT_INT0_vect definiert, für den 44A jedoch nur letzteres. Und noch 
SIG_INTERRUPT0 für den 44.
Ich bezeichne es noch immer als Unsauberkeit in den Headerdateien, einen 
anderen Grund sehe ich momentan nicht. Und es behindert den Umstieg vom 
44 auf den 44A.

von S. Landolt (Gast)


Lesenswert?

PS:
Also um ehrlich zu sein, hatte ich später mit meiner 
zusammengestoppelten C-Umgebung für den ATtiny44 beides, also INT_vect 
und EXT_INT_vect, ausprobiert, und fand in beiden Fällen im 
Assemblerlisting das korrekte "0x34 <__vector_1>".
  Da Marlin auch von Problemen mit der C-Umgebung sprach, grauste es 
mir, ich vergaß das Ganze schnellstens und freute mich auf mein nächstes 
Assemblerprogramm.

von S. Landolt (Gast)


Lesenswert?

> Datenblatt von Microchip

Nicht das Datenblatt, sondern:

https://www.microchip.com/webdoc/AVRLibcReferenceManual/group__avr__interrupts.html

von HildeK (Gast)


Lesenswert?

S. Landolt schrieb:
> Also um ehrlich zu sein, hatte ich später mit meiner
> zusammengestoppelten C-Umgebung für den ATtiny44 beides, also INT_vect
> und EXT_INT_vect, ausprobiert, und fand in beiden Fällen im
> Assemblerlisting das korrekte "0x34 <__vector_1>"

Ja, sagte ich doch, nur beim 44A passt es nicht.

S. Landolt schrieb:
> Nicht das Datenblatt
Naja, wenn der, der die Headerdateien schrieb, nicht dort seine Qelle 
hatte, kann es schon mal differieren.
Wichtig ist, das man weiß, dass es Inkonsistenzen geben kann.

von Marlin (Gast)


Lesenswert?

HildeK schrieb:
> Ja, das war offenbar nur ein Programmausschnitt, bei dem der LED-Pin gar
> nicht genannt wurde. Warum muss man die Leute immer wieder darauf
> hinweisen, einen vollständigen Code zu posten, der den Fehler enthält?

Der LED Pin war ja nicht das Problem wie im ersten Post geschrieben, 
daher hab ich nur die Stelle gepostet die nicht funktioniert. Der Fehler 
ist in einem iotn441.h Patch aus dem Netz für den GCC Cross Compiler in 
meiner Toolchain.
Hier das gesamte Testprogramm, das läuft mit AVR Studio d.h. ich muss 
mich jetzt um die korrekten Includes kümmern. Da fehlte im Vergleich zu 
oben nur die LED Initialisierung, und die war ja schon getestet.
1
int main()
2
{
3
  DDRB &= ~(1<<DDRB1);  
4
  DDRA |= (1<<DDRA6);  
5
    
6
  MCUCR |= ((1<<ISC01)|(1<<ISC00));
7
  GIMSK  = (1<<INT0);
8
  sei();
9
10
  for (;;) {
11
  }
12
} 
13
14
ISR(INT0_vect)
15
{
16
  PORTA ^= (1<<PA6);
17
}

von HildeK (Gast)


Lesenswert?

Marlin schrieb:
> Hier das gesamte Testprogramm,

Es ist wieder nicht das gesamte Testprogramm. Z.B. die Includes fehlen. 
Ein Compiler wird das so nicht übersetzen.
Meine Kritik war dahingehend gemeint: Du zeigst nur einen Ausschnitt und 
die ersten Antworten bemängeln bereits fehlende Teile. Die sind zwar in 
deinem vollständigen Programm enthalten. Das wäre nicht der Fall, wenn 
das, was du zeigst, übersetzbar ist und auch das Fehlverhalten zeigt. Es 
muss nicht dein gesamtes Programm sein, aber der Ausschnitt sollte für 
einen Helfer in seine Umgebung kopierbar und übersetzbar sein.

von Boris O. (bohnsorg) Benutzerseite


Lesenswert?

…besonders wenn man Prozeduren leer lässt, die der Compiler dann 
entsorgen darf. Du patchst am GCC herum, für deine eigene Toolchain? Was 
ist am AVR-GCC schlecht? Ich betreibe auch gern mal Compiler-Pr0n (das 
andere Wort triggert eine Spam-Meldung) und mache etwas Crossdev, aber 
den AVR-GCC würd' ich nie gegen den Gnu-CC tauschen wollen. Woher sollen 
die Gnu-CC-Entwickler die schmotzigen Details der AVR-Experten kennen? 
Und wenn ich überheblich sein will, weil ich es besser kann, dann 
schreib ich ASM ins C – in 100 Programmen bisher nur ein einziges mal.

von Marlin (Gast)


Lesenswert?

HildeK schrieb:
> Marlin schrieb:
>> Hier das gesamte Testprogramm,
>
> Es ist wieder nicht das gesamte Testprogramm. Z.B. die Includes fehlen.
> Ein Compiler wird das so nicht übersetzen.
> Meine Kritik war dahingehend gemeint: Du zeigst nur einen Ausschnitt und
> die ersten Antworten bemängeln bereits fehlende Teile. Die sind zwar in
> deinem vollständigen Programm enthalten. Das wäre nicht der Fall, wenn
> das, was du zeigst, übersetzbar ist und auch das Fehlverhalten zeigt. Es
> muss nicht dein gesamtes Programm sein, aber der Ausschnitt sollte für
> einen Helfer in seine Umgebung kopierbar und übersetzbar sein.

Ok, verstanden. Ich war nicht davon ausgegangen, daß das jemand versucht 
zu übersetzen, sondern eher das ein fachkundiger erfahrener Blick sieht, 
ob ich da was grundlegend falsch gemacht habe.

Die includes:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>

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.