PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Atmel mega32 Programm abbrechen



Titooo
26.02.2013, 19:58
Hallo liebe Mitglieder,

ich bin neu hier und habe auch noch keine Forum Erfahrungen, habe mir aber gedacht ich versuche es mal hier.

Vor kurzem habe ich angefangen mit C zu programmieren. Ich Programmiere mit AVR 5 den ATMega32 und habe auch schon erfolgreich Programme geschrieben bin nur an ein Problem gestoßen was ich nicht gelöst kriege.
Mein Problem ist das ich ein Programm habe es aber nicht mittendrin abgebrochen bekomme durch ein Signal. Habe schon irgendwas von interrupts gelesen bin da aber leider garnicht durchgestiegen.
Würde mich über Hilfe freuen.

Gruß Titooo

Wsk8
26.02.2013, 21:58
Was heißt mittendrin abbrechen bei dir? Paar Infos mehr wären nett.

mfg

Titooo
27.02.2013, 13:21
Also bei mir läuft ein Programm auf dem ATMega32. In dem Programm werden verschiedene Ausgänge angesteuert um LED's leuchten zu lassen.
Jetzt ist eine for Schleife drin die 100x den Befehl _delay_ms(10) druchläuft. Mein Wunsch ist es jetzt den Ablauf zu unterbrechen und an eine Bestimmte Stelle im Programm zu springen, von mir aus an den Anfang des main Programms. Weil wenn ich z.B. einen Zeitablauf habe der 1h dauert möchte ich den gerne Abbrechen können ohne die Stromversorgung zu entfernen oder den RESET Knopf zu drücken.
mfg

Wsk8
27.02.2013, 16:03
if(Signal) {
-- PORTX auf Input //PortX hängt an Reset
}

Dann gibts einfach nen Reset und alles fängt wieder von Vorne an.

mfg

Che Guevara
27.02.2013, 17:33
Hi,

du könntest auch den Watchdog starten und den AVR dann in eine Endlosschleife schicken ;)

Gruß
Chris

Titooo
27.02.2013, 18:39
Wsk8, aber da muss das Programm doch an dieser stelle vorbeilaufen um das Signal zu bekommen.
Che Guevara, was ist ein Watchdog und wie wende ich ihn an?

Was ich meine ist (habe so etwas gelesen) ein Ohr was die ganze zeit lauscht ob ein Signal auf einem bestimmten Port kommt. Wenn ja wird das Signal dem Programmablauf vorgezogen und reargiert dann irgendwie.

Gruß

Che Guevara
27.02.2013, 18:46
Hi,

meinst du vielleicht einen Interrupt an einem Pin? Irgendwie blick ich jetzt doch nicht mehr so ganz durch, was du willst.
Drück dich bitte mal sachlich korrekt & eindeutig aus ;)
Ein Watchdog ist eine Art Timer, bei dessen Überlauf der AVR resettet wird.
Er wird üblicherweise verwendet, um das hängenbleiben eines µCs zu erkennen und darauf zu reagieren.

Gruß
Chris

Wsk8
27.02.2013, 19:06
Ja, er meint wohl einen Interrupt. Aber ein Interrupt unterbricht dein Programm nicht ewig und fängt dann von Vorne an, sondern
Programm läuft ... Interrupt wird ausgelöst -> Interruptcode wird abgearbeitet ... Programm läuft normal weiter.

Wär toll wenn du dich etwas konkreter ausdrückst. Du klingst grad etwa so: Ich habe gehört, wenn ein Auto nicht funktioniert, dann muss man in ein Loch eine Flüssigkeit schütten.

mfg

JoeM1978
27.02.2013, 19:40
Wie es genau in C aussehen muss kann ich dir nicht sagen...
Bei Bascom würde es so ablaufen...

...

Config Pind.2 = Input 'Am Atmega8 der Int0-Pin

...
Config Timer1 = Timer , Prescale = 8 ' Timer konfigurieren und Takt einstellen
Config Int0 = Change ' Interrupt bei >wechselnder Flanke< des Echosignal starten
On Int0 Interuproutine_Name ' Bei Interrupt zu InteruptSubroutine springen
Enable Int0 ' Wenn auf Echo gewartet wird wechselt Echo-Signal auf High
Enable Interrupts ' Interrupts global aktivieren
...
SPRUNGMARKE_A
Hauptprogramm
blabla
Hauptprogramm
...

Interuptroutine_Name: ' Interrupt startet bei Signalwechsel am Int0-Pin
If Pind.2 = 1 Then ' Wenn Pin zu High wechselt ...
Goto SPRUNGMARKE_A ' Oder z.b. eine Variable setzen, die im Main immerwieder abgefragt wird
End if
Return


Gruss, Joe

Titooo
27.02.2013, 20:09
Das mit dem Watchdog klingt doch gut. Wenn ich einen Taster drücke wird der Grenzwert überschritten (z.B. eine erhöhung von 0 auf 1) und das Programm wird RESETET. Also es Startet einfach ganz von vorne ohne den Reset-Knopf zu drücken.
Aber wie wende ich so einen Watchdog an, an einem ATMega32 (ich Programmiere in C mit AVR). Habe geguckt werde aber aus dem Watchdog nicht schlau.

Sorry wenn ich mich nicht gut ausdrücke. Bin aber ganz neu in der Thematik.

Gruß

Tido
28.02.2013, 19:21
Hi,
ich verstehe das eigentliche Problem nicht. Warum willst du den Reset-Taster nicht nutzen, der genau die Funktion erfüllt, die du wünscht. Stattdessen willst du einen weiteren Schalter/Taster anlöten, der technisch nichts an deiner vorhandenen Konfiguration ändert.
Wenn du unbedingt den zus. Taster wünschst, würde ich zu Joe's Lösung tendieren, einen Taster am Int0-Pin abzufragen, in der Interrupt-Routine ein Flag (Variable) setzen und in der Main-Loop das Flag prüfen. Dann kannst du von dort an deinen Programmanfang springen, z.B. zur Initialisierung der Variablen.

Wsk8
28.02.2013, 19:32
Hi,
ich verstehe das eigentliche Problem nicht. Warum willst du den Reset-Taster nicht nutzen, der genau die Funktion erfüllt, die du wünscht. Stattdessen willst du einen weiteren Schalter/Taster anlöten, der technisch nichts an deiner vorhandenen Konfiguration ändert.
Genau das Frage ich mich auch schon die ganze Zeit????

mfg

Titooo
28.02.2013, 20:23
Ich danke euch allen.
Ich versuche mal das mit der Interrupt-Routine zu machen.

Gruß