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.
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
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.
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
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.
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
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
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
Das sendet. Steht unter vereinfachtem Datenaustausch im Datenblatt
(siehe Link). Ich hab die Rs232 in Leitung nämlich auf GND gezogen. Das
sendet sieht man auch mit nem Oszi.