BASCOM zeichen empfangen und dauerhaft lassen

#1253822
Lesenswert?

Ich sende vom PC aus ein t und die LED an meinem ATMEGA 8 beginnt zu 
leuchten. Diese LED erlischt allerdings nach ca. einer Sekunde. Was muss 
ich an Code hinzufügen, dass das nicht passiert d.h. die LED "ewig" 
leuchtet?

Code:

$regfile = "m8def.dat"
$baud = 9600
$crystal = 4000000

Dim I As Byte
Config Pinb.0 = Output

Do


If USR.RXC = 1 Then
    i = UDR
    Select Case i
    Case "H"
      Print "Hallo"
    Case "h"
      Print "hallo"
    Case "t"
      Portb.0 = 1
    Case Else
      Print "Unbekannter Befehl"
    End Select
  End If
Loop

End
#1253846
Lesenswert?

Schwer zu sagen, vielleicht passiert es wenn sich der Chip  resettet, 
warum auch immer...!?  Wie auch immer, mach das Interrupt gesteuert - 
Guck mal in deiner BASCOM Hilfe -  und zwar gibs nen Interrupt aka "on 
rxd" - wenn was empfangen wird, gibs den interrupt und deine Bedingungen 
die du jetzt in der do -loop hast, fügst du in die Interruptschleife 
ein.

Wenn du fragen zum genaue Code hast - kann ich heute nachmittig mal 
gucken

gruss
#1253854
Lesenswert?

INT0, INT1, INT2, INT3, INT4,INT5, TIMER0 ,TIMER1, TIMER2, ADC , EEPROM 
, CAPTURE1, COMPARE1A, COMPARE1B,COMPARE1

Das sind alles Interrupts die ich starten kann, nur welches ist für 
UART? Das hab ich noch nit ganz geschnallt. Danach kann ich se ja auf

low level: Pin auf Masse
Falling: fallende Flanke
Rising: steigende Flanke

Flanke ist wie ich das verstanden habe ein steigender bzw fallender Wert 
am PIN

Nur irgendwie versteh ich es noch nicht ganz. Erster Ansatz der 
natürlich nicht funktioniert:

$regfile = "m8def.dat"
$crystal = 4000000
$baud = 9600
Dim I As Byte
Config Pinb.0 = Output


On URXC OnRxD
Enable URXC
Enable Interrupts

Main:

If Usr.rxc = 1 Then
    i = UDR
    Select Case i
    Case "H"
      Print "Hallo"
    Case "h"
      Print "hallo"
    Case "t"
      Portb.0 = 1
    Case Else
      Print "Unbekannter Befehl"
    End Select
  End If

Goto Main

OnRxD:
  Incr I

Return


vorallem das OnRxD lässt mich rätseln
#1253873
Lesenswert?

Hallo, dein Prog sollte normalerweise funktionieren. Anders kannst du es 
so machen.
Setz mal das Print "Start" an den Anfang, dann kannst du sehen ob der 
Chip einen Reset macht oder nicht.
Und ob du Do-Loop oder Label-Goto benutzt ist egal.
Interrupt für sowas einzusetzen ist imho übertrieben wenns nicht 
wirklich mehr werden soll.
Als Tip, schliess die LED nach VCC an, da der Atmel die LED gegen Masse 
direkt treiben kann (Vorwiderstand nicht vergessen). Dann natürlich die 
Befehle invertieren, also Ein wird 0 und Aus wird 1


$regfile = "m8def.dat"
$baud = 9600
$crystal = 4000000

Ein Alias 1
Aus Alias 0

Dim I As Byte
Config Pinb.0 = Output
Portb.0=Aus

Print "Start"
Do ' Main:
  i = Ischarwaiting() ' ist ein Zeichen da
  If i = 1 Then       ' ja, da ist was
    i = Waitkey()     ' nimm es
    Select Case i     ' und werte aus
    Case "H"
      Print "Hallo"
    Case "h"
      Print "hallo"
    Case "t"
      Portb.0 = EIN
    Case Else
      Print "Unbekannter Befehl"
    End Select
  End If
Loop ' Goto Main
End
#1253935
Lesenswert?

habe es aus mehren Seite zusammen getragen. Manchmal hilft scrollen. Nur 
copy past nützt nicht viel, wenn man es anschließend nicht versteht. Das 
ohne Interrupts hab ich verstanden nur den Sprung über den Rand schaffe 
ich noch nicht

Ist


Enable URXC        'Interrupt URXC einschalten
Enable Interrupts  'Interrupts global zulassen


frei gewählt? oder ist URXC eine vorgegebene Variable bzw ein Interrupt? 
Fals ja wo steht es?
#1254086
Lesenswert?

nette mann schrieb:
> Also kann ich jedes Interrupt bennen wie ich möchte bis auf ein paar
> Ausnahmen?

Der Name des Interrupts (des Ereignisses) ist vorgegeben.
Aber die Funktion die den Interrupt bearbeitet, kannst du benennen wie 
du lustig bist. Mittels

On URXC OnRxD

stellst du ja dann sowieso die Verbindung zwischen dem 
Interrupt-Ereignis (in diesem Fall URXC) und der aufzurufenden Funktion 
(in diesem Fall OnRxD) her. Wenn deine Funktion, die diesen Interrupt 
bearbeitet SchnurdiBur heist, dann schreibst du halt

On URXC SchnurdiBur

natürlich brauchst du dann aber auch die entsprechende Funktion dafür

SchnurdiBur:
  ....
  Return
Gast #1254096
Lesenswert?

Bascom-Doku, Kapitel 6.277

>ON INTERRUPT
>Action
>Execute subroutine when the specified interrupt occurs.
>Syntax
>ON interrupt label [NOSAVE]

>Remarks
>Interrupt INT0, INT1, INT2, INT3, INT4,INT5, TIMER0 ,TIMER1, TIMER2, ADC ,
>EEPROM , CAPTURE1, COMPARE1A, COMPARE1B,COMPARE1. Or you can
>use the AVR
>name convention:
>OC2 , OVF2, ICP1, OC1A, OC1B, OVF1, OVF0, SPI, URXC,
>UDRE, UTXC, ADCC, ERDY and ACI.

Das sind die vordefinierten Interrupt-Namen. Die versteht Bascom.

Das ist jetzt zwar alles auf Englisch, aber die paar Worte wirst du ja 
noch hinkriegen.

Oliver
#1254546
Lesenswert?

Nette Mann schrieb:
> mit INT kann ich wenig anfangen denke das ist ADC

Man sollte vielleicht auch noch dazu sagen:

B e s o r g     D i r    d a s    D a t e n b l a t t
z u   D e i n e m    P r o z e s s o r !

Die unverständlichen Kürzel heissen in BASCOM deswegen so, weil sie 
Atmel im Datenblatt auch so genannt hat. Wenn du also mit INT0 im 
Datenblatt suchen gehst, wirst du fündig und erfährst alles was du 
darüber wissen willst.

Es ist ein Irrtum zu denken, nur weil einem Bascom vieles abnimmt, dass 
man sich mit der zugrundeliegenden Hardware nicht mehr beschäftigen 
muss. Und die wiederrum ist mit ihren Fähigkeiten ausführlichst im 
Datenblatt beschrieben.
#1254569
Lesenswert?

jetzt kommt es so rüber als ob ich copy past lieben würde. Dem ist nicht 
so!

2 0x001 INT0 External Interrupt Request 0
3 0x002 INT1 External Interrupt Request 1


also soll heißen wenn das interruppt genutz wird, das bestimmte ports 
entweder dauerhauft 0 oder 1 ist ??

und das ganze ist ja dann auch auf ner höheren ebene als wenn man PORT.C 
= 1 nehmen würde
#1254633
Lesenswert?

habs gerafft. Interrupt läuft neben dem Hauptprogramm. Das haupt 
programm wird schematisch abgearbeitet und das Interrupt nur dann, wenn 
sich was ändert was im Interrupt festgelegt wurde. Also main PB.1 = 1 
isses main programm das wird immer von oben noh unten abgerattert. 
Sollte also eine Bedingung die nicht als Interrupt gespeichert ist, sich 
ändern aber der µC ist nicht an der Stelle dann hat man eben Pech (bei 
mir das mit der LED) Im Interrupt wird ständig geprüft ob was anders 
ist. So hab ich es verstanden.
Gast #1254663
Lesenswert?

Na ja, etwas wirr, aber vermutlich trifft es das.

Um auf deine Ausgansgfrage zurückzukommen:
>Was muss
>ich an Code hinzufügen, dass das nicht passiert d.h. die LED "ewig"
>leuchtet?

Nichts. In deinem Ursprungs-Programm von ganz oben wird die LED nie 
ausgeschaltet. Wenn die doch wieder ausgeht, stimmt was anderes nicht. 
Störungen auf Stromversorgung  oder am Reset-Pin, was auch immer.

Oliver

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren