String empfangen

Hi Bonze,

ich möchte hier nochmals an die Verwendung "krummer" Taktungen erinnern. Mit einem Mega8 z. Bsp. kannst Du bei einem externe Quarz von 14.7456MHz oder 3.6864MHz fehlerfrei bis zu 115k (Fehlerquote <0.2%) über die RS232 übertragen.
Ich habe viel Zeit mit der Rumprobiererei mit geraden MHz vertrödelt, mit dem 14er hat's sofort funktioniert.

Hilft jetzt vielleicht nicht, kannste ja mal im Hinterkopf behalten. Der Link zum Rechner:

http://www.gjlay.de/helferlein/avr-uart-rechner.html


Grüsse,

Michael

- EDIT: Werner hat mit ASM recht; Du kannst in Bascom z. Bsp. recht einfach ASM- Routinen einbinden.
 
Hallo zusammen !

Einen Rechner für Baudraten?
Dafür hatte Dirk sogar extra mal ein nettes kleines Programm geschrieben,
avr-usart-calculator.png


dass man HIER herunter laden kann. :)

Grüße,
Cassio
 
Hallo!

Ach so.....
Wer auch noch einen Rechner für die Timer benötigt,
der findet HIER auch ein Tool zum Berechnen. :)

avr-timer-calculator.png



Erspart so manche eigenhändige Rechnerei mit dem Taschenrechner. ;)


Grüße,
Cassio
 
also ich hab ja den 1284, mit 16Mhz quarz, und ne standartbaudrate (da ich eigentlich keine großen datenmengen übertrage) von 9600, werd mich morgen damit nochma auseinandersetzen um rauszufinden wie ichs machen will, .. event dann die assamblerroutine anpassen,.
 
Hallo zusammen,

ich bin der Meinung, wer sich vor Assembler scheut, das man bei dieser simplen Anwendung sehr gut auch bei BASCOM Bordmitteln bleiben kann.

1. BASCOM bietet alle Möglichkeiten das sauber zu implementieren
2. Das Buffer-Konzept von BASCOM ist mit 255 Bytes Buffer-Speicher völlig ausreichend
3. Beim Senden via Print oder Printbin kann man mit Bordmitteln dafür sorgen, dass nur die nackten String ggf. ohne Null-Terminierung und <cr><lf> übertragen werden.
4. Putty kann man so einstellen, dass ggf. auch keine <cr><lf> üpbertragen wernden
5. Wenn Standardmäßig <cr><lf> übertragen werden dann kann man die sauber am Ende eines jeden Strings weg-subtrahieren.

Zunächst sollte man sich aber genau darüber im Klaren werden, was genau von wo nach wo übertragen werden soll und was dann übertragen wird.

Grüße,
Markus
 
Hi,

frohes Neues Euch Allen.


- BONZE

ich weiss jetzt nicht, ob Dein Problem noch aktuell ist.

Der einfachste Weg, Steuerzeichen zu unterdrücken, ist doch ein nachgestelltes Semikolon, z. Bsp. Print "Text";

Strings >1 habe ich noch nicht direkt über die RS232 verarbeitet, deswegen habe ich mal kurz den Walter befragt (so schön, diese Bücher).
Herausgekommen ist das folgende, einfache Beispiel- Programm ohne weitere "Tricks" mit Verarbeitung und Ausgabe. Ich verwende übrigens AVR- Term.
Die LCD- Ausgabe dazu habe ich jetzt nicht getestet, sollte aber gehen.

command (1- n) ist die Anforderung vom PC (Terminal oder PC- Programm)
zeit der angeforderte Wert

Vielleicht hilft es auch anderen Neueinsteigern:



CodeBox bascom

'____________________________________________________________________
'
'Name : PC - Mega8.bas
'Autor : ACVision (c) 2006 - 2011, M.Gewohn
'Funktion : Kommunikationstest: PC/ Atmega8
'µC : Atmega8 - 16, 14.7456MHz
'____________________________________________________________________
'
$regfile = "m8def.dat"
$crystal = 14745600 ' Problemfreie Baudraten bis zu max. 115K2 der Hardware
$baud = 9600 ' COM 1
$hwstack = 40
$swstack = 12
$framesize = 32
'____________________________________________________________________
'_____ Compiler- Direktiven/ LIB's einbinden ________________________________
'
'____________________________________________________________________
'_____ Ports definieren _________________________________________________
'
DDRB = &B0000_0000 ' PortB - Eingang
portb = &B1111_1111 ' Pullups aktiviert
'
DDRC = &B0000_0000 ' PortC - Eingang
portc = &B1111_1111 ' Pullups aktiviert
'
DDRD = &B0000_0010 ' PortD = Eingang
portd = &B1111_1101 ' Pullups aktiviert
'____________________________________________________________________
'_____ Variablen - Subroutinen - Label ____________________________________
'
Dim command as string * 10
dim IsData(11) as byte at command overlay
dim zeit as single
dim n as byte
zeit = 12.34 : command = "" : n = 0
'____________________________________________________________________
'_____ Register _______________________________________________________
'
ADCSRA.7 = 0 : ACSR.7 = 1 'ADC und Komparator abgeschaltet
on URXC GetCommand ' Empfangs- Interrrupt- Routine
enable URXC
sreg.7 = 1 ' Interrupts an
'____________________________________________________________________
'_____ Pins zuweisen __________________________________________________
'
'____________________________________________________________________
'_____ Hauptprogramm ________________________________________________
'
'config waitsuart = 1
waitms 500
'
Print "Mega8 ok!"; ' AVR online?
do
If n = 10 then ' Alle Zeichen entsprechend der DIM da?
select case command ' Zuordnung des richtigen Kommando- Strings
case "SectorTime"
Print command ; ": " ; fusing(zeit , "##.##") ; " ";
LCD command
n = 0
case else
Print "Command Failed!"; ' Ausgabe, wenn falsch
n = 0
end select
endif
loop
End
'____________________________________________________________________'
'_____ Unterprogramme ________________________________________________
'
GetCommand:
incr n ' Nächstes Zeichen einlesen
IsData(n) = udr ' und Eins nach dem Anderen einfügen
return
'____________________________________________________________________'
'



Grüsse,

Michael
 
Ja das problem is noch aktuell obwnhl ich schon nen besseren code wie am anfang hab. Bin zurzeit aber in prag und kann es deshalb nicht ausprobieren
 
Hi Bonze,

kein Problem, hier soll sich niemand gehetzt fühlen. Mein Beispiel sollte ja lediglich eine kleine Hilfestellung geben. Falls Du/ Ihr Neueinsteiger neben den Onlnehilfen auch Bücher lesen magst/ mögt, kann ich Dir/ Euch folgende empfehlen:
  • AVR Mikrocontroller Lehrbuch von Roland Walter
  • Die deutsche Übersetzung der BASCOM- Hilfe von Marius Meissner
  • Programmieren der AVR RISC Mikrocontroller mit BASCOM-AVR von Claus Kühnel (für fortgeschrittene Anwender)
Kosten zwar zusammen ca. €150, aber der Kauf lohnt sich.

Ich habe den Test nochmal mit einem PC- Programm (GfA-Basic) durchgeführt; die Ein- und Ausgaben funktionieren auch damit einwandfrei, ohne Tricks oder "Klimmzüge". Und so schnell, dass 9600baud für den Anfang völlig ausreichend sind.

:offtopic:Damit habe ich schon den Einstieg in die Rennbahnsteuerung mit Anforderungen vom Atmel und Ausgaben innnerhalb einer PC- Oberfläche...:)


Grüsse,

Michael
 
Hallo zusammen,

ich möchte Michael voll und ganz in der Auswahl der Bücher unterstützen! Es sind gute Bücher und die Anschaffung lohnt sich!
Ich selbst habe mir zum Einstieg das Buch von Claus Kühnel gegönnt, danach war alles klar :D . Zugegeben, ich war etwas vorbelastet.

Grüße,
Markus
 
Hi Wolfgang,

na dann wümsch ich auch schnell nochmal ein frohes neues Jahr ;)

da kann ich auch noch einen Buchtip beisteuern, der mir per Newsletter zugeflattert ist :D :

http://www.elektor.de/elektronik-news/buch-avr-mikrocontroller-und-bascom.1657426.lynkx

lohnt sich bestimmt, die Ausgabe, werde sie bestimmt bestellen :rolleyes:
Elektor-Lehrgänge sind eigentlich recht gut. Bücher die aber nur von elektor
rausgebracht oder verkauft werden und nicht auf Lehrgängen aus den
Heften basieren sollte man aber sicherheitshalber vorher mal "probelesen".
Ich bin da bei nem Buch was in der ct angeboten wurde reingefallen. Das
war nur ne Sammlung von HowTos und Konfig-Optionen. Das hat sich leider
nicht gelohnt. Soll aber jetzt nix heißen ...

Auszug aus der elektor-Beschreibung ...
Dabei ist die Erklärung der Befehle sehr kurz und knapp gehalten, was mitunter an ein Datenblatt erinnert. Wer blutiger Anfänger ist, muss sich die Erkenntnisse daher anhand der nachvollzogenen Beispiele erarbeiten, doch dies ist gerade im Bereich der Programmierung kein Nachteil. Besonders gut wird das Buch demjenigen gefallen, der schon etwas Erfahrung mit (AVR-)Mikrocontrollern mitbringt.
Also anscheinend ein gutes Nachschlagewerk aber für Anfänger mit Problemen
bei den Grundlagen nicht ganz so zu empfehlen. Aber die werden dann sowieso
mit vielen Büchern Probleme haben. Da wird es dann schon schwierig ein
Buch zu empfehlen was paßt.

Ich arbeite im Moment eigentlich noch mit der Bascom-Referenz und Code-
Beispielen von allen möglichen Leuten die ich dann versuche zu verstehen
und zu modifizieren. Später wird der "geklaute" Code dann normalerweise
mehr und mehr durch eigene Ideen ersetzt.

Gruß
Dino
 
Soooo... in der Zwischenzeit ist viel in diesem thread geschrieben worden.

Bonze, hast Du die Chance mal kurz den aktuellen Stand nochmals zusammenzufassen damit kurz und bündig wieder mal klar wird, welche Probleme noch existieren und wo Du Unterstützung brauchts. ggf. bitte auch gleich Code einstellen.

Grüße und viel Erfolg,
Markus
 
ja, aber frühstens am fr, hab dann fachgespräch, und beende dann endlich meine Ausbildung als Elektroniker für Automatisiserungstechnik
 
so hab heute nochma gespielt,
hab mir überlegt ich werds wohl so machen
der pc sendet eine reihe von daten:

chr(2) ' start der nachricht
String1 chr(10)
String2 chr(10)
String3 chr(10)
String4 chr(10)
.....
chr(3)'ende der nachricht

wobei die anzahl mal ausser acht gelassen werden soll, kann sich verändern,
ich geh aber im moment mal von 4 aus

würde das ungefähr so machen
wenn uart register = 2 goto empfangen

dann irgendwie sowas
Empfangen:
'anzahl der empfangenen zeichen um 1 erhöhen
Array = 0
Set Led2
If Udr = Lf Then
Udr_i = 0 'zeichenzähler zurücksetzen 'Wenn text ends(3) /LF(10) in UDR steht string beenden
Text(array) = Buffer
Buffer = ""
Call Draw_box(0 , Xyz , 0 , 20 , Black)

Print "Empfangen: " ; Text ; " Zeichenanzahl: " ; Udr_i
Incr Array
If Array = 4 Then 'wenn array element 4 erreicht dann setze array auf 0
Array = 0
End If
Else
Buffer = Buffer + Chr(udr) 'an string anfügen
Incr Udr_i 'zeichenzähler um 1 erhöhen
End If
Reset Led2
Return
 
so, hab hier mal ne neue version
Code:
Empfangen:                                                  'anzahl der empfangenen zeichen um 1 erhöhen

      Set Led2
      If Udr = 10 Then                                      'eindenter string wird auf zeichen LF geprüft
         Musik(arraynumber) = Buffer                        'buffer wird dem array element zugewisen
         Call Draw_box(0 , Xyz , 0 , 20 , Black)
            Print " | Array Element: " ; Arraynumber ; " | Empfangen: " ; Text ; " | übertragene Zeichen: " ; Udr_i
            Print
         Incr Arraynumber                                   'array elemente zähler wird um 1 erhöht
            If Arraynumber = 4 Then                         'wenn array element 4 erreicht dann setze array auf 0
               Arraynumber = 0
            End If
         Buffer = ""                                        'buffer leeren
         Udr_i = 0
      Else
         Buffer = Buffer + Chr(udr)                         'an string anfügen
         Incr Udr_i                                         'zeichenzähler um 1 erhöhen
      End If
   Reset Led2
Return

hab mal die neue version angehangen, scheint zu funktionieren, hat vielleicht jemand noch ne optimierungsidee?
hab im moment ne ziemlich totzeit, weil ich erst ne ausgabe mache wenn alle 4 arrayelemente gefüllt wurden

meine Terminalausgabe sieht so aus

| Array Element: 0 | Empfangen: onpköl. | übertragene Zeichen: 8
| Array Element: 1 | Empfangen: onpköl. | übertragene Zeichen: 8
| Array Element: 2 | Empfangen: onpköl. | übertragene Zeichen: 8
| Array Element: 3 | Empfangen: onpköl. | übertragene Zeichen: 8
 
ok bin grad noch an ner Select case variante, diese funktioniert allerdings nich so wie ich möchte.
bzw sie geht garnich
Code:
Empfangen:

      Set Led2
      If Udr = 10 Then                                      'eingehender string wird auf zeichen LF geprüft
         Countar = Split(buffer , Teile(1) , " ")
buffer = ""
         Select Case Teile(1)
            Case "Title":
                     Musik(1) = Teile(2)
                     print "Musik1 "; musik(1)
            Case "Artist":
                     Musik(2) = Teile(2)
                     Print "Musik2 " ; Musik(2)
            Case "Bitrate":
                     Musik(3) = Teile(2)
                     Print "Musik3 " ; Musik(3)
            Case "Lenght":
                     Musik(4) = Teile(2)
                     Print "Musik4 " ; Musik(4)
            Case "Played":
                     Musik(5) = Teile(2)
                     Print "Musik5 " ; Musik(5)
            Case Else:
                  Print "Nix sinnvolles angekommen"
         End Select

      Else
         Buffer = Buffer + Chr(udr)                         'an string anfügen

      End If

er gibtmir egal was ich sene nur nix sinnvolles angekommen aus
 

Ü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)