UART 1 und 2 Konfiguration für ATmega128 unter BASCOM

Markus

BASCOM-Experte
11. Jan. 2008
1.190
6
38
Lonsee
Sprachen
Hallo zusammen,

anbei ein kurzes Beispiel, wie man sehr einfach unter BASCOM-AVR auf die zwei RS232-Schnittstellen (UART) des ATmegas128 zugreifen und z.B. Debug-Infos ausgeben kann.

Inbetriebgenommen und getestet habe ich das ganze mit einem ATmega128 und 16 MHz auf einem STK500 + STK501 von ATMEL.

Viele Grüße,
Markus
 

Anhänge

  • COM1_und_COM2.zip
    349 Bytes · Aufrufe: 526
Hi,

ich habe mir dein Beispiel angeschaut und versuche im Moment den UART2 eines mega64 zum laufen zu kriegen. soweit ich weiß sind ja mega128 und mega64 weitestgehend identisch. Ich habe nun aber das Problem, dass ich zwar vom PC zum µC senden kann (mit Oszi gemessen kommt an an PIN27 - PD2 RXD1) allerdings sendet der µC selbst nichts raus (PIN28 - PD3 TXD1 ist immer auf 5V)

ich poste hier mal mein test-quellcode:


$regfile = "m64def.dat"
$crystal = 7372800
$baud = 9600

Config Com2 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0

Open "com2:" For Binary As #2

Do
Print #2 , "test"
Waitms 1000
Loop

Close #2

End

Irgendwelche Vorschläge? Sind vielleicht irgendwelche Register oder Fusebits falsch eingestellt? Für Hilfe wäre ich sehr dankbar
 
ich habe den fehler gefunden:

man muss zusätzlich noch

$baud1 = 9600

einstellen dann klappts wunderbar
 
Hallo, guten Morgen,

im großen und ganzen machst Du in Deinem Code ja erst mal nichts anderes als ich in meinem Beispiel-Code. OK!

Code:
$regfile = "m128def.dat"
$crystal = 16000000

Config Com1 = 38400 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Com2 = 38400 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0

Open "com1:" For Binary As #1
Open "com2:" For Binary As #2

Do
   Print #1 , "test serial port 1"
   Wait 2
   Print #2 , "test serial port 2"
Loop

Close #2
Close #1

End

Habe aber ein paar Fragen zu Deiner Konfiguration:
- mit welcher Beschaltung hast Du Deinen ATmega64 mit dem PC verbunden?
- welche HW Basis verwendest Du? Ist da bzgl. Pin27 und Pin28 noch was beschaltet oder ist die HW nackt?
- Warum verwendest Du noch das $baud Statement? Das ist an dieser Stelle dann überflüssig da Du die Konfig ja über "Config Com2" machst.

Allgemeines:
[1] Das Du Probleme mit Registern oder Fuses hast kann ich mir nicht unbedingt vorstellen da hinten RXD1 und TXD1 nur Interrupts stecken die in Deinem Beispielcode nicht initialisiert sind.
[2] Schau mal in Deinen Fuses nach ob Du das JTAG Interface aktiviert hast. Ich hatte in der Vergangenheit schon damit Probleme und als ich JTAG deaktiviert hatte waren auch die Probleme plötzlich weg. Frag mich aber nicht nach den Zusammenhängen.
[3] Welche BASCOM-Version verwendest Du? Die aktuelle Version ist die 1.11.9.0. In Fällen bei denen "komische" Verhalten auftreten neige ich dazu immer auf die aktuellste Version upzudaten. Mir ist zwar jetzt kein Problem den UART betreffend direkt in einer älteren Version von BASCOM bekannt aber ausprobieren würde ich es auf jeden Fall.
[4] Die von Dir gewählte Baudrate im Verhältnis zum Clock ist ideal und müßte mit einer BAUD error rate von 0% bestens funktionieren, hmmm ?!?!?

Halt, mir fällt was ein :)
Wie ist denn die Fuse M103C bei Dir programmiert? Wenn Die Fuse programmiert ist verhält sich Dein ATmega54 wie ein M103 und der hat keinen extended UART2 soweit ich weiß.
Du must auf jeden Fall sicherstellen, dass die Fuse auf M64 steht.


Schau mal nach und geb mir Bescheid!

Grüße,
Markus
 
Hallo und vielen Dank für die Antwort. Mit diesem Code funktioniert es einwandfrei:

$regfile = "m64def.dat"
$crystal = 7372800
$baud = 9600
$baud1 = 9600

Config Com2 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0

Open "com2:" For Binary As #2

Do
Print #2 , "test"
Waitms 1000
Loop

Close #2

End

wieso er unbedingt baud1 haben will obwohl ja com2 mit config com2 ... konfiguriert wurde ist mir ein Rätsel... auf jeden Fall funktioniert es so jetzt wunderbar =)

programmiert wird das ganze über ISP mit einem STK200/STK300 Programmer der auch selbst zusammengelötet ist

PC-Verbindung über RS232Kabel (selbstgelötet nur RxD, TxD, GND und den entsprechenden Anschlüssen am m64)

der µC läuft im M64-Modus und JTAG ist deaktiviert

BASCOM Version 1.11.8.3
 
Hallo,

anscheinend hatten sich unsere beiden Antworten unten überschnitten und Du hattest bereits eine Lösung zu dem Zeitpunkt als ich noch meine Abhandlung verfasst habe.:p

Iss ja aber nicht weiter schlimm. Um so verwirrter bin ich, dass Du überhaupt die $baud-Statements benötigst. Ich verstehe es auch nicht denn
Code:
$baud
$baud1
machen nix anderes als die Baudrate für UART1 und UART2 festlegen. Nachdem Du aber mit
Code:
Config Com2 = [COLOR="Red"][B]9600[/B][/COLOR] , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
die Initialisierung bereits schon durchführst sind meiner Meinung nach die Befehler $baud und $baud1 überflüssig. Das Problem muss also aus einer anderen Richtung herkommen.

Das ist mal wieder der Unterschied zwischen Theorie und Praxis. In der Theorie wissen wir wies funktionieren sollte aber es tut nicht und so wie es dann tut wissen wir nicht warum.:)

Du könntest vielleicht noch eins probieren. Wenn Du nur COM2 verwendest dann nummerier mal #2 um auf #1. Vielleicht hat BASCOM ein Problem wenn Du nur einen UART (COM2) verwendest, diesen aber mit #2 öffnest obwohl es keine #1 gibt. Ich würde dann auch die $baud-Statements komplett weg lassen und es mal ausprobieren.

Wie gesagt, bei mir funktioniert es ohne $baud. Allerdings verwende ich - wenn COM2 only - auch die Sequenz
Code:
Open "com2:" For Binary As #1

Grüße,
Markus
 
hi,
ich habe es gerade nochmal ausprobiert: wenn ich $baud und $baud1 auskommentiere funktioniert die kommunikation nicht. $baud kann ich weglassen aber $baud1 muss stehenbleiben ansonsten keine kommunikation möglich. da ich aber im moment eh nur 6% speicher nutze kann man das denke ich verschmerzen ;)
com2 war von anfang an als #1 deklariert
auf jeden fall vielen dank für die hilfe es hat jetzt glücklicherweise funktioniert =)
 
Hallo,

sorry wenn ich nochmal dumm nachfrage aber mir fehlt noch eine Anwort auf eine ganz wichtige Frage!

Wie hast Du Den PC mit der RS232 des ATmega verbunden? Ich hoffe nicht direkt:(

In Deinem anderen Beitrag beschreibst Du komische Effekte mit Oszi-Spitze dran das es funktionier usw. Das ist komisch!!!!!

Also prinzipiell:
Um einen AVR-Mikrocontroller mit einem COM-Port eines PC's zu verbinden, bedarf es noch einer Pegelwandlung. Zur Pegelwandlung wird im allgemeinen ein MAX232 oder MAX231 verwendet. Dieser Baustein nimmt wie Wandlung von 5V auf 12V und retour vor. Das direkte Beschalten des ATmegas mit einer RS232 vom PC aus funktioniert nicht und führt in der Regel zur Zerstörung des UART Interface.

Hast Du das umgesetzt? Das geht aus Deinen Antworten nicht hervor, ist aber basic für eine korrekt funktionierende RS232!

Grüße,
Markus
 
Hallo,

der mega64 ist über ein MAX202 angeschlossen der die Pegelwandlung vornimmt. Hätte ich dazuschreiben sollen

gruß
st3fan
 
Hallo Markus, ich war richtig erfreut als ich dein Beitrag gefunden habe, denn ich habe genau dies stundelang versucht und nie geschafft, habe es dann mit deinem Beispiel versucht und siehe da... es ging auch nicht. Ich habe ebenfalls ein STK500 von Atmel und den 128er mit dem avrstudio programmiert.

Jetzt musst du mir sagen ob ich alles richtig verbunden habe. Das serielle kabel habe ich an den rs232 spare angehängt. Bevor ich es mit deinem beispiel versucht hatte ich es so versucht den portd.1 mit dem pin.txd zu verbinden. wie muss ich dies denn nun machen? es sind ja 2ausgänge, abgesehen davon ging es davor ja auch nicht

grüsse dani
 
Hallo Dani,

verwendest Du auch das STK501 als Aufsatz zum STK500 um den Mega128 im Nullkraftsockel zu betreiben?

Um hier die RS232 1 (Standard) (TXD0 & RXD0) - welche in BASCOM entweder mit $baud konfiguriert und mit Print bzw. über COM1 und #1 angesprochen wird - wird das zweipolig Patch-Kabel welches im Set vom STK500 enthalten ist zwischen PortE.0 (1) und PortE.1 (2) (Beschriftung auf PCB) sowie RS232 SPARE RXD unD TXD angebracht. Zur Verdeutlichung habe ich Dir ein Bild von meinem Aufbau hinzugefügt.

Wie Du dem Datenblatt entnehmen kannst liegen nämlich auf PE0 und PE1 des Mega128 RxD0 und TxD0.

Wenn Du nun COM2 (RxD1 und TxD1) verwenden möchtest so liegen diese auf PD3 und PD4. Je nachdem wie Du nun zählts, ob Du bei den Pins mit 1 oder mit 0 anfängtst (fangen wir mal bei 1 an gemäß Beschriftung) musst Du das Patch-Kabel auf PortD.3 und PortD.4 patchen. Da dies nicht mit einem zweipoligen Patckabel geht brauchst Du hier 2 Kabel, entweder einpolige oder zweipolige.

Der von Dir verwendete Pin PD1 ist auf jeden Fall falsch! Die Pin's vom STK500 und STK501 sind auf jeden Fall (in der Regel :D ) 1:1 durchgeschleift und auf den Pfostenleisten aufgelegt.

Dann müsste es auf jeden Fall von der Beschaltung her funktionieren!

Aber noch was!!!! Der Atmega128 hat einen ATmega103 Kompatibilitätsmodus welcher über Fuses gesteuert wird. Ist der Kompatibilitätsmodus also och aktiv kannst Du vom Chip her schon nicht auf COM2 zugreifen da es diese "nicht gibt". Überprüfe also Deine Fuses!

Das ist das ganze Hexenwerk! Ich hoffe Dir damit weitergeholfen zu haben,
viele Grüße und schönen Abend,

Markus
 

Anhänge

  • RS232.jpg
    RS232.jpg
    18,7 KB · Aufrufe: 56
Hallo Markus,

ja ich verwende ebenfalls den STK501-Aufsatz.

Den Kompatibilitätsmodus habe ich mit dem Fuse abgeschaltet und ich bekomme auch auf beiden COM's eine Ausgabe per Terminal.... aber nur mist, irgendwelche undefinierten Zeichen.

Habe nun ein bisschen herumprobiert und habe herausgefunden dass der die Ausgabe nur bei einer Baud von 19200 schluckt, wieso das?

Könntest du mir bitte noch den Unterschied zwischen serout und Print erklären und wo genau die Unterschiede und Vorteile der beiden Befehle sind oder hast du gerade eine Seite im Kopf wo ich das nachschlagen kann und wo das gut erklärt ist?

Ich danke dir jedefalls schon für die nette undumfassende Hilfestellung
Dani
 
Um Gottes Willen, was tust Du hier Dani!!!!!:vroam:

SEROUT ist ein in BASCOM Software nachbegildeter UART der über kein eigenes HW-UART-Interface verfügt sondern der als Software-Library und damit als dynamische Simulation auf dem Mega läuft. Der Unterschied hier ist, dass der HW-UART bzgl. Funktion und Pins vom Mega vorgegeben wird, beim SEROUT kannst Du, da alles in SW läuft, beliebige PIN's angeben. Uffff!

Eine Seite oder sowas kenne ich nicht. Aber der Befehl und die Unterschiede sind ganz gut in der BASCOM Hilfe beschrieben. Hier lohnt es sich auf jeden Fall mal rein zu schauen.

Der Print-Befehl dagegen funktioniert anders. Er dient wirklich dazu, Daten auf einem RS232-Port in HW gegossen zu senden! Der Print Befehl kann nur verwendet werden wenn Du auch eine RS232-Schnittstelle auf Deinem Mega hast. Auch hier ist die BASCOM Hilfe sehr ausführlich und es lohnt hier rein zu schauen.

Wenn Du mein Beispiel aus diesem Thread verwendest und gemäß meiner Beschreibung die Verkabelung vornimmst solltest Du auf jeden Fall saubere Daten senden und empfangen können.

Aber Achtung! Es spielt noch eine große Rolle mit welchem Takt Du den Mega versorgst und wie die Fuses eingestellt sind. Verwendest Du den internen Takt des Megas oder hast Du einen Externen? Wenn Extern, dann welchen? Den vom STK500 oder einen eigenen Quartz?

Die Fuse-Einstellungen sollten unbedingt überprüft und ggf. korrigiert werden. Du solltest auch prüfen ob Deine $crystal Einstellung im Code korrekt ist. Aufgrund der $crystel Einstellung leitet der BASCOm Compiler z.B. auch seinTiming für SEROUT ab. Wenn hier die EInstellungen nicht stimmen bekommst Du Datensalat!

Grüße,
Markus
 
Da siehst du wie mann sich als Anfänger immer und immer wieder verrennt.

Also dein Beispiel mit Print funktioniert ja gut an dem liegts nicht, (das senden habe ich zwar nicht versucht, nur das empfangen von Daten über den Terminal) aber eben nur mit 19200 Baud. Ich verwende den internen ozi(der heisst doch so?) vom atmega128(auf dem stk501) und zwar auf 8mhz. im code ist der auch so definiert.
Das mit Serrout war einfach sonst ne frage die mich interessierte und hatte ansich nichts mit deinem Beispiel zu tun.

Das heisst wenn ich dich richtig verstanden habe, kann mann mit dem serout und serin Befehl, gar keine Daten über RS232 versenden? (soweit ich mich erinnere, steht in meinem schlauen Buch vom Geschäft nur drinn wie die Funktionen aufgebaut sind und was für Parameter die erwarten.)

Und sorry, aber wenn ich schon gleich einen Profi an der anderen Ende der Leitung habe, (im Internet habe ich stunden verbratet, dies zu suchen... nix gefunden) ist es denn möglich in Bascom ein ganzes Integer Array per RS232 zu verschicken?

Grüsse Daniel

PS: ich führe mir nun noch die BASCOM-Hilfe zu Gemüte und dir wünsche ich nen schönen Abend
 
Nicht automatisch, das musst Du mit For-Schleife selbst schreiben!
 
Hallo Markus


ich habe Deinen Code ausprobiert, doch leider erhalte ich auf beiden UART nur Datenmüll im Terminal.
Dann habe ich einen Software UART gebaut und da funktioniert die Übertragung problemlos.

JTAG ist deaktiviert und der Atmega128 läuft auch im Atmega128 modus.
Ich weiß jetzt echt nicht mehr weiter.

Gibt es da ein paar Fuses oder andere Einstellungen, damit die UART richtig funktionieren?

Danke für Deine Hilfe
 
Hallo Marco,

ich habe Deinen Code ausprobiert, doch leider erhalte ich auf beiden UART nur Datenmüll im Terminal.
Dann habe ich einen Software UART gebaut und da funktioniert die Übertragung problemlos.

JTAG ist deaktiviert und der Atmega128 läuft auch im Atmega128 modus.
Ich weiß jetzt echt nicht mehr weiter.

Gibt es da ein paar Fuses oder andere Einstellungen, damit die UART richtig funktionieren?

ich hab bei mir alle 2 UARTs am Mega128 laufen. Als Grundlage hab ich damals auch Markus seinen Code verwendet und ihn dann nach meinen Wünschen angepaßt.

Stell doch mal DEINEN kompletten Code hier rein damit man einen Blick drauf werfen kann. Markus seiner läuft ja. Also kann man sich den Blick darauf sparen.

Hier mal meine Initialisierungsteile ...
Code:
' #############################################################################
' ##### Basisroutinen für das Mega128-EvalBoard ###############################
' #############################################################################
' (c) 27.06.2010 by Dino
' BASCOM 2.0.7.0
'
'

' Prozessor ATmega128
$regfile = "m128def.dat"
' 14,7456MHz Quarztakt (Baudraten-Quarz)
$crystal = 14745600

$hwstack = 128
$swstack = 128
$framesize = 128

' =============================================================================
' ===== PortD =================================================================
' =============================================================================
' PD0 ---->-- SCL | I2C
' PD1 --<->-- SDA | TWI
'
' PD2 --<---- RxD1 | UART1
' PD3 ---->-- TxD1 | TTL-Pegel
'
' PD4 --<---- Taster1 (links)
' PD5 --<---- Taster2
' PD6 --<---- Taster3
' PD7 --<---- Taster4 (rechts)
'
' I=7= I=6= I=5= I=4= O=3= I=2= I=1= O=0=  => 00001001 => DDRD
'  T4   T3   T2   T1  TxD1 RxD1 SDA  SCL   => 11110110 => PORTD (init)
'   |    |    |    |    |    |    |    |
'
Ddrd = &B0000_1001
Portd = &B1111_0110
'
' =============================================================================
' ===== I2C/TWI initialisieren ================================================
' =============================================================================
$lib "i2c_twi.lbx"                                          ' Bibliothek fuer Hardware-TWI einbinden
Config Scl = Portd.0
Config Sda = Portd.1
I2cinit
Config Twi = 300000                                         ' Taktfrequenz 300 kBit/s
' TWI gleich einschalten, das macht BASCOM ansonsten erst beim I2CStart
'Twcr = &B00000100                                           ' nur TWEN setzen
' Optionale Einstellungen für TWI Kommunikation die nicht zwingend erforderliche sind
' Twsr = 0                                                 ' Status und Prescaler Register
' Twbr = 152                                               ' Bit Rate Register, 72 = 100kHz   152 = 50kHz(0 bis 255)
' Config I2cdelay = 40
I2cstart
I2cstop
'
' =============================================================================
' ===== UART1 (TTL) initialisieren ============================================
' =============================================================================
Config Com2 = 57600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Serialin1 = Buffered , Size = 16
Open "com2:" For Binary As #2



' =============================================================================
' ===== PortE =================================================================
' =============================================================================
' PE0 --<---- RxD0 | UART0
' PE1 ---->-- TxD0 | RS232-Pegel
' PE2 --<---- CTS  | mit Hardware-
' PE3 ---->-- RTS  | Handshake
'
' PE4 -- frei
' PE5 -- frei
' PE6 --<---- DS1307 SQWout (auf INT6)
' PE7 --<---- DCF77-Empfaenger
'
' I=7= I=6= I=5= I=4= O=3= I=2= I=1= O=0=  => 00001010 => DDRD
' DCF  SQW  ---- ---- RTS  CTS  TxD0 RxD0  => 11111111 => PORTD (init)
'   |    |    o    o    |    |    |    |
'
Ddre = &B0010_1010
Porte = &B1111_1111
'
' ===== UART1 (RS232) initialisieren ==========================================
Config Com1 = 460800 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Serialin = Buffered , Size = 16
Open "com1:" For Binary As #1

und ein paar Ausgaben ...
Code:
Print #1 , "UART0 (COM1) " ; Date$ ; " " ; Std_s ; ":" ; Min_s ; ":" ; Sec_s

Print #1 , "............................. ";

Print #2 , Chr(b);

So läuft es bei mir problemlos. In dem Code sind die ersten Basteleien mit mehreren UARTs. Ist bestimmt verbesserungswürdig aber läuft.

Gruß
Dino
 
Hallo dino03

vielen Dank für Deine Antwort.
Ich hbae mir jetzt die letzten Tage meinen Code und Deinen Code genau angeschaut.
Nachdem ich immer noch keine vernünftigen Ausgaben bekommen habe, habe ich den Atmega128 auf internen RC mit 8Mhz gestellt.
Und siehe da, es funktioniert.
Also wieder auf externen Quarz eingestellt und wieder Datenmüll.

Ein genauer Blick auf meine Schaltung und den zugehörigen Schaltplan hat gezeigt, dass ich den falschen Quarz eingelötet hatte.
Da ich allerdings auf den Atmega vollen Zugriff hatte und auch die Fuse setzten konnte, war ich auf diese Idee des falschen Quarz erst gar nicht gekommen.

Ein genauer Blick ins Datenblatt hat dann gezeigt, dass der Atmega128 nur mit max 16MHz läuft. Bei mir war allerdings ein 18,432MHz Quarz drin.

Einfacher Fehler, große Auswirkung.

Jetzt, da ich einen 16MHz Quarz drin habe, funktionieren beide UART richtig :)

Vielen Dank für Deine Hilfe.

LG
 
Du hattest den Mega also übertaktet. Wenn Du im Terminalprogramm Datenmüll empfagen hast, scheint der wirklich noch gelaufen zu sein - Bascom hat anhand der falschen Crystal-Angabe halt 'n falschen Wert für die Baudrate errechnet. Wenn Du dort den 18,xxxx-Wert als Crystal vorgeben würdest, oder im Terminal den tatsächlichen Wert (irgendwo so um die 12000 Baud) einstellen, sollte es auch mit dem 18MHz-Quarz gehen...
 
Hi,

also 18,3MHz statt 16MHz sollte nen Mega noch problemlos mitmachen. Garantie von Atmel gibts dafür nicht aber es sollte passen. Du mußt natürlich auch im Programm für die richtige Angabe sorgen damit das Timing stimmt. 18,3MHz ist schon nen gutes Stück von 16MHz entfernt. Da werden die Bits am UART natürlich falsch gesampelt und du bekommst nur Müll.

Gruß
Dino
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)