mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Status abfragen, bevor es ins Hauptprogramm geht / BASCOM


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo an alle,

sorry für den blöden "Betrefftext", mir ist nichts besseres eingefallen.

Ok nun zur Frage:

ich habe einen M32 der über INT0 ein Empfängersignal einliest. Das 
Signal ist nur aus (1ms) oder ein (2ms).

Nun möchte ich in meinem Programm so eine Art Sicherung einbauen, dass 
es erst losläuft, wenn der Schalter auf "Aus" ist. Das Signal messe ich 
mit einer Interrupt Routine.

Nun wollte ich eine IF Schleife vor dem eigentlichen Programmstart 
setzen (Do-Loop-End), also noch bei den Initialisierungen. Das Problem 
dabei ist, dass das Programm da anscheinend noch nicht in die Interrupt 
Routine springt und ich somit das Signal nicht auswerten kann.

Dann wollte ich es mit einer Do-Loop Until Schleife im Programm 
versuchen, das geht auch nicht, da er auch dort nicht in die Routine 
springt.(?)

also wie kann ich es geschickt lösen, dass das Programm erst richtig los 
geht, wenn der Schalter aud AUS ist?
ist sicherlich kinderleicht, aber ich bin noch Anfänger...

Vielen Dank!
Lg
Peter

Autor: Glaskugel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>Das Signal messe ich mit einer Interrupt Routine.

wie sieht die aus ? (code)

>>Das Problem dabei ist, dass das Programm da anscheinend noch nicht in die 
>>Interrupt Routine springt ...

wenn der Interrupt bereits eingerichtet und freigegeben ist, dann schon.
Zeig doch mal, was du bisher schon hast.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:
>
> Nun wollte ich eine IF Schleife vor dem eigentlichen Programmstart
> setzen (Do-Loop-End), also noch bei den Initialisierungen. Das Problem
> dabei ist, dass das Programm da anscheinend noch nicht in die Interrupt
> Routine springt und ich somit das Signal nicht auswerten kann.

Sobald du die Interrupts freigibst, sind sie freigegeben.
Die zentrale Do-Loop hat damit nichts zu tun

Du hast dann eben in deinem Programm 2 Do-Loops

die erste wartet solange bis die Anfangsbedingung hergestellt ist und 
die zweite ist die eigentliche Arbeitsschleife.

Du scheinst in der Vorstellung zu leben, dass die übliche Do-Loop 
irgendetwas besonderes darstellen würde und über irgendwelche Magie 
verfügt. Dem ist aber nicht so. Das ist einfach nur eine ganz normale 
Schleife. Und klar kannst du auch meherer Schleifen hintereinander 
machen, so dass der Programmfluss von einer Schleife in die nächste 
fällt, wenn bestimmte Bedinungen eintreten. Nur aus der letzten sollte 
der Programmfluss dannn nicht mehr herauskommen.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für deine Antwort,

anbei mal mein Code.
$regfile "m32def.dat"
$crystal = 8000000
$baud = 9600
$hwstack = 32
$swstack = 10
$framesize = 40


Config Portc = Output
Config Pind.4 = Output
Config Pind.5 = Output
Config Pind.6 = Output
Config Pind.7 = Output
Config Pind.2 = Input

Config Pina.6 = Output
Config Pina.5 = Output
Motor1 Alias Porta.6
Motor2 Alias Porta.5
Motor1 = 0
Motor2 = 0


Config Lcdpin = Pin , Db4 = Portd.7 , Db5 = Portd.4 , Db6 = Portd.5 , Db7 = Portd.6 , E = Portc.0 , Rs = Portc.1
Config Lcd = 20 * 2


Cursor Off
Config Timer1 = Timer , Prescale = 1
Config Int0 = Change

Dim Reading As Bit
Dim Rc_value As Word
Dim Value As Single
Dim Signal As String * 10
Dim Calc As Word
Dim Einschaltsignal As Bit

Dim Servowert_1 As Byte

On Int0 Rc_read

Enable Timer1
Stop Timer1
Enable Int0
Enable Interrupts

Config Servos = 1 , Servo1 = Portc.4 , Reload = 10

Cls




'###################################################

Do

Locate 1 , 1
Lcd "Signal:"
Locate 1 , 15
Lcd "ms"
'Locate 2 , 1
'Lcd Rc_value
Value = Rc_value / 8000
Signal = Fusing(value , "#.##")
Locate 1 , 11
Lcd Signal

Calc = Value * 100
Servowert_1 = Calc - 50
Servo(1) = Servowert_1

Locate 2 , 1
Lcd Servowert_1

If Value > 1.5 Then
   Motor1 = 1
   Motor2 = 0
Else
   Motor1 = 0
   Motor2 = 1
End If

Loop
End



'####################################################


Rc_read:
If Reading = 0 Then
   Start Timer1
   Reading = 1

Else
   Stop Timer1
   Rc_value = Timer1
   Timer1 = 0
   Reading = 0
End If
Return


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AHHHH,

ich glaube, ich habe meinen Fehler gefunden.

in der Interrupt Routine wird zwar ein Wert gebildet. Aber umgeformt 
wird der Wert erst in dem Hauptprogramm. Daher konnte das nicht 
funktionieren...
Das muss ich jetzt mal schnell austesten.

Oft ist es einfach gut, wenn man wo was postet, man kommt hin und wieder 
doch selber drauf.

Dann werde ich es jetzt genau mit den zwei Schleifen versuchen!

DANKE!

Lg
Peter

Autor: BASCOM möger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:
> Nun wollte ich eine IF Schleife vor dem eigentlichen Programmstart
> setzen (Do-Loop-End), also noch bei den Initialisierungen. Das Problem
> dabei ist, dass das Programm da anscheinend noch nicht in die Interrupt
> Routine springt und ich somit das Signal nicht auswerten kann.

Ich verstehe nicht so genau was du sagen willst, aber vielleicht hilft 
ja dieser Ansatz:

Nimm eine Variable zum Testen ob das Programm 'loslaufen' darf, und 
setze diese im Interrupt.

Selbst wenn -warum auch immer- das Programm noch nicht in die 
Interruptroutine springt, wartet es trotzdem weil die Variable eben noch 
nicht nicht den erforderlichen Wert hat.

Autor: mue-c (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist doch alles viel zu kompliziert.
Schreibe einfach am Anfang deines Programms

Biwait Pind.2, Reset

Dies sollte vor dem Config Int0 = Change stehen.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke an alle,

habs nun geschafft!

Nun habe ich eine erneute Frage an euch:

Ich verwende nun einen 3 Stufen Schalter an meiner Fernsteuerung. Also 
lese ich am M32 3 Werte ein. Schalter unten ist 1ms, Schalter mitte ist 
1,5ms und Schalter oben ist 2ms.

Also das einlesen ist kein Problem, das funktioniert alles. Nun müssen 
aber gewissen Handlungen geschehen (Servos steuern, Leds leuchten...), 
je nach dem, wo der Schalter steht. Das schwierige daran ist, dass das 
Programm erkennen muss, wo der Schalter vorher war. Also wenn man die 
mittlere Stellung vom Schalter nimmt, so muss ich wissen, ob der 
Schalter von oben kommt, oder von unten kommt, da je nach dem andere 
Handlungen gesetzt werden müssen.

wie könnte ich das am besten angehen? Ich möchte dazu gerne "Case 
select" nehmen. Ich habe dazu mal das Eingangssignal in mehrere Ebenen 
unterteilt.

Anbei ein bisschen Code....
If Rc_value > 8000 And Rc_value < 9000 Then Signalstufe = 1
If Rc_value > 9000 And Rc_value < 10000 Then Signalstufe = 2
If Rc_value > 10000 And Rc_value < 11000 Then Signalstufe = 3
If Rc_value > 11000 And Rc_value < 12000 Then Signalstufe = 4
If Rc_value > 12000 And Rc_value < 13000 Then Signalstufe = 5
If Rc_value > 13000 And Rc_value < 14000 Then Signalstufe = 6
If Rc_value > 14000 And Rc_value < 15000 Then Signalstufe = 7
If Rc_value > 15000 And Rc_value < 16000 Then Signalstufe = 8


If Value < 1.1 Then Status = 1
If Value > 1.3 And Value < 1.7 And Signalstufe < Value_old Then Status = 21
If Value > 1.3 And Value < 1.7 And Signalstufe > Value_old Then Status = 22
If Value > 1.9 And Status = 3


Value_old = Signalstufe


Select Case Status

   Case 1
   Locate 1 , 1
   Lcd "Klappen zu       "
   Locate 2 , 1
   Lcd "Hebel drin       "

   Case 22
   Locate 1 , 1
   Lcd "Klappen auf      "
   Locate 2 , 1
   Lcd "Hebel aus        "

   Case 21
   Locate 1 , 1
   Lcd "Klappen offen    "
   Locate 2 , 1
   Lcd "Motor aus        "

   Case 3
   Locate 1 , 1
   Lcd "Klappen offen    "
   Locate 2 , 1
   Lcd "Motor ein        "
End Select


Autor: Hannes Lux (hannes)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich weiß nicht, ob es Dir hilft, aber ich hänge mal ein paar Spielereien 
in Bascom an, wo ein AVR als Modellbau-Schaltmodul eingesetzt wird. Ich 
hab's mal für einen Programmieranfänger (TV- und Elektronik-Fachman) 
geschrieben, so in der Hoffnung, dass es es selbst an eigene Bedürfnisse 
anpassen kann.

...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.