UART Problem mit Bascom

Gast #67241
Lesenswert?

Hallo,

ich habe ein ATMega8535. An die serielle Schnittstelle (Rxd) soll nun
ein Modul welches ein Signal mit 300bps, 7 Datenbits, 2 Stoppbits und 1
geradem Paritätsbit aussendet. Und zwar 15 Bytes und anschließend ein
CR. Nun soll ein String 15 Bytes groß die Daten aufnehmen und bei jeder
neuen Übertragung aktualisiert werden. Zur Kontrolle hab ich ne
Verbindung zum PC wo der String hingesendet wird. Aber da kommt nix an.
Hardware müsste eigentlich stimmen. Hab sie nicht nur einmal
kontrolliert.

Achso wenn der µC ständig einen Text ausgeben soll (im Programm
festgelegt) klappt das wunderbar.

Kann mir jemand helfen. Ich hab das jetzt in Bascom probiert, da ich
eigentlich nur Basic kann.
Gast #67242
Lesenswert?

wie ist das nu, soll der avr senden oder empfangen?
wenn ich's recht verstanden hab, sendet das modul und der avr
lauscht.
... aber da kommt nix an... (am PC?, der 'mithört')
stellt sich die frage, sendet das modul überhaupt?
der pin RX ist der empfänger (receive) der TX der sender (transmitter)
wer soll denn nu was machen?
weil, funzen tut die serielle schnittstelle problemlos.
noch was, ticken die auf ttl-pegel oder hast du 'nen
schnittstellenbaustein dazwischen, sowas wie max232?
die avr-schnittstelle arbeitet nämlich invertiert, vielleicht liegt ja
hier der hund begraben.

fröhliches arbeiten noch, gruss, harry
Gast #67243
Lesenswert?

Also soweit hast du das schon verstanden.
So hab ichs jetzt aufgebaut

 ______      ___      ____________       ________      ___
|       |    |   |    |            |     |        |    |    |
| Modul | -> | 1 | -> | ATMEGA8535 | -> O| MAX232 | -> | PC |
|_______|    |___|    |____________|     |________|    |____|


So das is das Datenblatt von dem DCF-Modul:
http://www.hkw-elektronik.de/pdf/fmd01001_sd.pdf

Der PC soll später wieder ab. Das Modul sendet auch.
Hab ich mal direkt an MAX232 gehängt und dann stimmt
auf dem Bildschirm alles.

Mein Problem ist eigentlich das im Bascom das SoftwareUART
nix annimmt. Andere Sachen wie im Tutorial hier (www.rowalt.de) gehen
auch alle.
Gast #67245
Lesenswert?

naja, vor'm pc hängt ja auch der max232, der invertiert das signal und
bietet's allem weitern 'mundgerecht' an. wenn das modul serielle
daten ausgibt (und die nicht invertiert) kriegt sie der avr falsch -
musste invertieren, am einfachsten mit bc546. wenn das modul die daten
invertiert ausgibt und der avr invertiert empfangen kann (kanner), dann
ist der code nicht richtig. haste mal vom pc daten an den avr
geschickt? kann der avr vom pc empfangen? mal versuchen.

nettes stricken noch, gruss, harry
Gast #67246
Lesenswert?

Das Problem ist nur mit dem der onrxd Routine klappt das mit PC zum µC
und zurück. Mit dem SotwareUART oder HardwareUART Programm von Bascom
klappt garnix.

Ich denk immernoch das es ein Softwareproblem ist. Vom Modul konnte er
mit der onrxd Routine nix vernünftiges empfangen, da das Modul so
kommische Übertragungswerte hat (7 Datenbits, 1 Pariätsbit und 2
Stoppbits). Ich weiß aber nicht wie ich das im µC ändern kann.
Gast #67248
Lesenswert?

Hast ja recht...
Also der hier geht wenn ich vom PC aus sende
Ich schätze mal das das Modul nicht geht weil die
zwei Stoppbits nich eingetragen sind.
Ich weiß auch nich wie
-----------------------------------------------------------------
$Regfile  = "m8535".dat 'ATMEGA8535-Deklarationen
$Crystal  = 1000000     'Quarz: 3.6864 MHz
$Baudrate = 300        'Baudrate der UART: 9600 Baud

Dim i As Byte

Do
  If USR.RXC = 1 Then  'Wenn Byte empfangen...
    i = UDR            'Byte aus UART auslesen
      Print i
Loop
End
-----------------------------------------------------------------

Und diese Quellcodes sind die Originalcodes von Bascom. Und die gehen
überhaupt nicht. Auch nicht Rechner -> µC.

Harware UART
-----------------------------------------------------------------
$crystal = 1000000
$baud = 300

'first compile and run this program with the line below remarked
Config Serialin = Buffered , Size = 20


'dim a variable
Dim Name As String * 16

'the enabling of interrupts is not needed for the normal serial mode
'So the line below must be remarked to for the first test
Enable Interrupts
Print "Start"
Do
   'get a char from the UART
   Name = Inkey()

   If Err = 0 Then                                          'was there
a char?
      Print Name                                            'print it
   End If

   Wait 1                                                   'wait 1
second
Loop
------------------------------------------------------------------

Und das Software UART
------------------------------------------------------------------
$crystal = 1000000

'tell the compiler which chip we use
$regfile = "m8535.dat"

'some variables we will use
Dim S As String * 10
Dim Mybaud As Long
'when you pass the baud rate with a variable, make sure you dimesion
it as a LONG

Mybaud = 300
Do
  'first get some data
  Serin S , 0 , D , 0 , Mybaud , 0 , 8 , 2
  'now send it
  Serout S , 0 , D , 1 , Mybaud , 0 , 8 , 2
  '                                      ^ 1 stop bit
  '                                  ^---- 8 data bits
  '                                ^------ even parity (0=N, 1 = E,
2=O)
  '                        ^-------------- baud rate
  '                  ^-------------------- pin number
  '               ^----------------------- port so PORTA.0 and PORTA.1
are used
  '           ^--------------------------- for strings pass 0
  '      ^-------------------------------- variable
'  Wait 1
Loop
End
---------------------------------------------------------------------
So ich hoffe das ihr mir jetzt vielleicht weiterhelfen könnt.

Ich dank euch schonmal für eure Hilfe
Gast #67249
Lesenswert?

Zumindest der Software UART sollte funktionieren wenn die Parameter
richtig eingestellt sind.

>>300bps, 7 Datenbits, 2 Stoppbits und 1
>>geradem Paritätsbit aussendet

Serin S , 0 , D , 0 , Mybaud , 0 , 8 , 2 ist definitiv nicht richtig.

Parität, Anzahl Stoppbits und Anzahl Datenbits stimmen nicht.

Für den Hardware-Uart werden wohl einige Bits in den Steuerregister
manuell engestellt wer´den müssen (steht im Datenblatt).

Gruss
Bernd
Gast #67251
Lesenswert?

Im Prinzip ist das Paritybit auch nur ein Datenbit.

Wenn ich das Modul richtig verstehe sendet es nur Daten auf
Anforderung. Enweder durch Befehl (irgendwas und CR) oder durch Pegel
auf der RXD-Leitung am Modul.


Bernd

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