Jannis sagte schon: Ein Interrupt ist dafür nicht besonders gut
geeignet. Allerdings hat Jannis das Programm an anderen Stellen
verbockt.
Daher von vorne. Gehen wir dein Programm durch
ISR (INT0_vect) {
if(on) { DDRB = 0b000000; on = 0; }//ausschalten
if(!on) { DDRB = 0b000001; on = 1; }//einschalten
}
(Im folgenden ist x immer der Name eines Ports. Also zb bei Port B wäre
x daher B, und dein PORTx wäre dann PORTB, DDRx wäre dann DDRB, PINx
wäre PINB. Für den Port C wäre das dann PORTC, PINC und DDRC etc. etc)
DDRx
Das DDRx Register steuert, welcher Pin Eingang ist und welcher Pin
Ausgang. Typischerweise stellt man das am Programmanfang ein (man weiß
ja welcher Pin was sein soll) und lässt diese Einstellung danach in
Ruhe!
Wenn du ausgeben willst, dann wird an das PORTx Register ausgegeben!
Wenn du einlesen willst, dann kriegst du diese Information vom PINx
Register.
Aber das DDRx Register lässt du in Ruhe!
WEnn du einen AUsgangspin auf 1 setzen willst, dann lautet die Phrase
PORTx |= ( 1 << Pinnummer );
Wenn du denselben Ausgangspin auf 0 setzen willst, dann lautet die
Phrase
PORTx &= ~( 1 << Pinnummer );
Um einen Portpin abzufragen, lautet die Phrase
if( PINx & ( 1 << Pinnummer ) ) {
... der Eingangspin ist auf 1
}
else {
... der Eingangspin ist auf 0
}
oder
if( !( PINx & ( 1 << Pinnummer ) ) {
... der Eingangspin ist auf 0
}
else {
... der Eingangspin ist auf 1
}
der grundsätzliche Programmaufbau sieht (fürs erste) IMMER so aus
1 | #include ....
|
2 |
|
3 | int main()
|
4 | {
|
5 |
|
6 | Einstellen aller beteiligten Komponenten
|
7 | das bedeutet: Pins auf Eingang oder Ausgang
|
8 | Pullupwiderstände ein/aus
|
9 | Timern ihre Grundkonfiguration
|
10 | UART einstellen
|
11 | ...
|
12 |
|
13 | eventuell ein sei(), wenn mit Interrupts gearbeitet wird
|
14 |
|
15 | while( 1 ) {
|
16 |
|
17 | hier kommt die eigentliche Arbeit, die der µC machen soll.
|
18 | Wie zb Pins abfragen und andere Pins auf 1 oder 0 stellen
|
19 |
|
20 | }
|
21 | }
|
Du wirst die nächsten 30 Programme mit diesem Grundgerüst durchkommen.
Tasten macht man nicht über Interrupts. Denn du hast da ein
Grundproblem: Tasten prelln. Dieses Prellen ist mechanisch bedingt und
du kannst es nicht so einfach umgehen. Prellen bedeutet: Du drückst
einmal auf den Taster; dein µC registriert aber 2 bis 4 Schaltvorgänge,
weil Taster nun mal keine idealen mechanischen Bauteile sind.