und... probiert? :)
teste das doch mal... wo hast du eigenlich die funktion startswitch her?
Druckbare Version
und... probiert? :)
teste das doch mal... wo hast du eigenlich die funktion startswitch her?
@damaltor: Die Funktion StartSwitch() ist in der originalen asuro.c drin.
@izaseba: Hab deinen Code mal auf meine Syntax umgeschrieben:
Und er funktioniert nicht!Code:#include<avr/io.h>
#include<avr/interrupt.h>
#include<avr/signal.h>
SIGNAL(SIG_INTERRUPT1){
PORTB &=~(1<<PB0);
PORTD = (1<<PD2);
}
int main(void) {
DDRB = (1<<PB0);
DDRD = (1<<PD2);
MCUCR = (1<<ISC11);
GICR = (1<<INT1);
sei();
PORTB = (1<<PB0);
while(1);
return 0;
}
oha... das hatte ich gar nicht mehr in erinnerung... fuktioniert folgender code?
Code:#include "asuro.h"
int main(void){
Init();
StartSwitch();
switched=0;
StatusLED(GREEN);
while(1){
if(switched==1) StatusLED(RED);
}
}
Der Compiler behauptet, dass die Variable switched nicht deklariert wurde.
Außerdem wird in der StartSwitch() auch auf keine Variable geschrieben, sie ist nur dazu da, um den Int1 auf die Schalter zu legen und den IR-Betrieb zu initialisieren.
hm. schlecht.
poste doch mal bitte deine startswitch funktion.
Hab den oberen Beitrag nochmal editiert...
Hier is die StartSwitch():
Code:void StartSwitch(void)
{
SWITCH_OFF;
DDRD &= ~SWITCHES; // Switches as Input => ext. Int 1
MCUCR &= ~((1 << ISC11) | (1 << ISC10));// Low level generates interrupt
GICR |= (1 << INT1); // Enable external Interrupt 1
}
soweit, so gut. ich sehe keine fehler mehr im moment, habe grad mal im irc nach hilfe gefragt. mal sehen was noch kommt...
Vielleicht findet sich ja jemand, der den code testen würde...
Gruß an alle.
Interressant!
izaseba gibt für MCUCR an: MCUCR = (1<<ISC11);
Im original Source steht:
MCUCR &= ~((1 << ISC11) | (1 << ISC10));// Low level generates interrupt
(Im Übrigen muss ich damaltor zustimmen, dass Einwände höflicher gestaltet werden können.)
Beim Programmcode kann ich izaseba allerdings nur zustimmen, dass sein Code auf alle Fälle 'richtiger' sein muss. Der INT1-Pin ist, ohne gedrückten Taster, über R24/1K und R23/1M auf U+ gelegt.
Bei gedrücktem Taster, selbst K6 mit nur R30/68K, geht die Spannung auf alle Fälle in Richtung 0 Volt. Somit also tatsächlich eine fallende Flanke. Und damit sollte ISC11=1 und ISC10=0 laut ATmega8-Doku Seite 64, und izaseba, gesetzt werden.
------------------------
Test 1:
Letztes Programm von farratt ohne Motorbewegung, nur mit original Funktionen.
- Asuro einschalten
- LED geht auf gelb (Wartezeit zum download neuer Programme)
- LED geht auf grün (Feststecken in der main() while(1)-Schleife nach dem Init() und StartSwitch()
- beliebige Taste drücken: LED geht auf ROT
Somit ist es erst einmal egal ob fallende oder steigende Flanke (wie im original Source) programmiert ist. Warum ist hier egal.
Somit ist auch festgestellt, dass das Programm grundsätzlich funktioniert.
------------------------
Test 2:
Da ich die Funktion fahren() von farratt nicht habe, fahre ich nach Init() und StartSwitch() einfach mit MotorDir(FWD,FWD); und MotorSpeed(180,180) einfach so los.
In der Interruptfunktion dann natürlich noch ein MotorSpeed(0,0).
- Asuro einschalten
- LED geht auf gelb (Wartezeit zum download neuer Programme)
- LED geht auf grün (Feststecken in der main() while(1)-Schleife nach dem Init() und StartSwitch() und Motoren drehen
- beliebige Taste drücken: LED geht auf ROT und Motoren stoppen
Fazit:
Mein Asuro schafft das gewünschte Problem zu bearbeiten.
Was kann kaputt sein?
Ich tippe auf eine unterbrochene Verbindung beim Widerstand R23/1M, da die Ermittlung der Tasten ja geht, aber der Widerstand R23 ja nur parallel zum R24/1K bei der Tastenmessung zu Buche schlägt, und sich dort somit fast nicht auswirkt.
Ist die Verbindung aber unterbrochen, könnte es sein, dass dies vom AVR schon als LOW-Pegel 'gesehen' wird, und somit ein Tastendruck nicht noch mehr LOW erzeugen kann, und somit keine fallende Flanke am AVR ankommt.
Messen kann man dies so:
- AVR aus dem Sokel nehmen.
- Asuro einschalten
- Spannung zwischen Pin 1 (V+) und Pin 27 (PC4/ADC4) messen. Sollten mehr als 3 Volt sein.
P.S.: Noch ein Wort zu SIGNAL() bzw. dem wohl gemeinten INTERRUPT().
SIGNAL() hat ja die nette Eigenschaft, dass der gerade laufende Interrupthandler NICHT durch weitere Interrupts unterbrochen wird. Somit ist das Handling über dieses Macro auf alle Fälle überschaubarer.
Wer sich auf INTERRUPT() einläßt, muss schliesslich noch mit gestaffelten Aufrufen rechnen, die auch noch, durch die in der Hardware festgelegte Priorität der Interrupts, nicht immer gestaffelt auftreten müssen. Dies dürfte hier aber nicht für jederman handelbar sein, und würde in diesem Fall auch keine Vorteile, geschweige den funktionierendes Verhalten, bringen.
[flüster]Das Programm läuft bei dir und bie mir nicht?[/flüster]
[schrei]wuhaaaaaa...waruuuum?[/schrei]
also zwischen Pin1 und Pin27 messe ich knapp 4,9V