Forum: Mikrocontroller und Digitale Elektronik Port setzen geht immer nur beim ersten mal


von Tilmann (Gast)


Lesenswert?

Hallo,

um festzustellen, ob mein ATmega644P serielle Daten korrekt empfängt, 
habe ich ein einfaches Bascom-Programm geschrieben, mit dem Port A auf 
das Bitmuster des empfangenen Integer-Dezimal-Wertes gesetzt wird.
Beim jeweils ersten mal nach dem einschalten funktioniert das auch 
zuverlässig. Beim zweiten mal wird der Port aber auf 0 gesetzt, egal was 
ich schicke. Was mache ich falsch ?

Gruß Tilmann

_____________________________________

$regfile = "m644Pdef.dat"
$crystal = 1000000
$baud = 300

Ddra = 0
Config Porta = Output

 Dim A As Byte

 Do
  'Print " Gib Dezimalwert ein ! "
  Input A
  Porta = A
Loop

End
____________________________________

von Stefan (Gast)


Lesenswert?

Ich habe keine Ahnung von Bascom. Allerdings vermisse ich in dem 
Programm ein paar Zeilen Code, die den seriellen Port ansprechen oder 
zumindest entsprechende Funktionen aus einer Library aktivieren.

von Paul B. (paul_baumann)


Lesenswert?

Versuche das einmal:

$regfile = "m644Pdef.dat"
$crystal = 1000000
$baud = 300

Ddra = 0
Config Porta = Output

 Dim A As Byte

 Do
  'Print " Gib Dezimalwert ein ! "
    If UCSRA.RXC=1 Then 'Wenn ein Byte vollständig empfangen wurde
      A=UDR             'Dann steht es im Regsiter UDR zur Verfügung
      Porta = A         'und wird nun ausgegeben
    end if
 Loop

End

Print "MfG Paul"
;-)

von Tilmann (Gast)


Lesenswert?

Hi Paul,

danke, aber der Compiler schimpft fürchterlich über die Zeile
 "If Ucsra.rxc = 1 Then", weder ucsra noch rxc seinen dimensioniert, 
und überhaupt seien sie unvollständig ...

Error : 93 Line: 17 Varable not dimensioned[0->0]
Error : 31 Line: 17 Invalid data type [[0011]0[RCX]]
Error : 93 Line: 17 Varable not dimensioned[0->0]
Error : 31 Line: 17 Invalid data type [[0011]0[UCSRA]]

???

Müßte ich im Datenblatt schauen, wie das Eingangsregister heißt ?

Gruß Tilmann

von Paul B. (paul_baumann)


Lesenswert?

Tilmann schrob:
>Müßte ich im Datenblatt schauen, wie das Eingangsregister heißt ?

Ja, besser ist das. Das ist leider nicht einheitlich mit den Namen.

MfG Paul

von Paul B. (paul_baumann)


Lesenswert?

Soweit ich sehe, müßte das Register hier
UCSR0A heißen  (sprich NULL a)
UDR0 ist das Empfangsregsiter, wo die empfangenen Bytes drinsitzen.

und das Bit heißt RXC0

Ich kann es im Moment hier nicht ausprobieren.
MfG Paul

von Tilmann (Gast)


Lesenswert?

Hi Paul,

tatsächlich ist der Compiler damit einverstanden:

___________________________________
 Do
  'Print " Gib Dezimalwert ein ! "
   If Ucsr0a.rxc0 = 1 Then      'Wenn ein Byte vollständig empfangen 
wurde
      A = Udr0                  'Dann steht es im Regsiter UDR zur 
Verfügung
      Porta = A                 'und wird nun ausgegeben
   End If
Loop
__________________________________

Allerdings lese ich immer eine 10 aus, egal was ich schicke ...

Gruß Tilmann

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.