Forum: Mikrocontroller und Digitale Elektronik BASCOM zeichen empfangen und dauerhaft lassen


von Nette M. (nette-mann)


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

von Axel K. (axel)


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

von Nette M. (nette-mann)


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

von Joachim R. (bastelbaer)


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

von Oliver (Gast)


Lesenswert?

Kommt, wenn die LED ausgeht, die Meldung "Unbekannter Befehl" ?


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

Komisch. Hier:

http://www.rowalt.de/mc/avr/avrboard/04/avrb04.htm

findet sich nicht nur die Vorlage für dein Programm, sondern auch die 
Variante mit Interrupt.

Oliver

von Nette M. (nette-mann)


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?

von Oliver (Gast)


Lesenswert?

????

http://www.rowalt.de/mc/avr/avrboard/04/avrb04.htm

noch weiter scrollen (und auch lesen). Da steht doch alles drin.

>Fals ja wo steht es?

In der Bascom-Doku, und bei google

Oliver

von nette mann (Gast)


Lesenswert?

Also kann ich jedes Interrupt bennen wie ich möchte bis auf ein paar 
Ausnahmen?

von Karl H. (kbuchegg)


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

von Oliver (Gast)


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

von Nette M. (nette-mann)


Lesenswert?

mit INT kann ich wenig anfangen denke das ist ADC

CAPTURE ist irgendwas mit einfangen

der rest ist logisch

von Karl H. (kbuchegg)


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.

von Nette M. (nette-mann)


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

von Oliver (Gast)


Lesenswert?

Lies das Datenblatt, kauf dir ein Buch,
oder lies das hier:

http://www.mikrocontroller.net/articles/AVR-Tutorial:_Interrupts

(und bitte nicht nur diesen Abschnitt lesen, sondern das ganze 
Tutorial).

Erst lesen, dann fragen. Sonst wird das nichts.

Oliver

von Nette M. (nette-mann)


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.

von Oliver (Gast)


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

von Nette M. (nette-mann)


Lesenswert?

Reset denke ich da der mk2 öfters sagt das das RESET falsch sei

Habe es so:

5V----10KOHM--|
              |
    GND---47nF---PIN1
              |
   ISP-RESET---

von Nette M. (nette-mann)


Lesenswert?

nehm ich die 47nF weg leuchtet die LED länger allerdings resettet der 
mk2 den ATmega danach gleich

liegt am ISP programmier gerät

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.