Forum: Mikrocontroller und Digitale Elektronik Software+Hardware UART's für atmega32


von Chriss (Gast)


Lesenswert?

Hallo,
ich sitze nun schon einige tage/wochen da und Reis mir bald die haare 
aus...
bekomm Hardware und Software UART zum laufen aber nur bei den RX/TX 
Pins,
habe aber wo gelesen das man auch andere pin’s nehmen könnte
was ich benötigen würde 2x UART also 1x Software und 1x Hardware-UART.

PC <-> Chip1 <-> Chip2

Chip2: Tasta + LCD-Display 16*2
Chip1: Kontakt-Reader’s + MotorDriver, e.c.t
Es soll von Chip2 zu Chip1 die tasten gesendet werden und evtl. 
Meldungen ans Displ.
Cip2 und Chip1 sind getrennt also räumlich (Aussen/-Innen-Einheit) max 
2-5m
Der Pc soll als Logger und evtl. Remote verwendet werden.

ja ich weis, es gibt einen atmega mit 2 UART’s, aber ich will es wenn’s 
mal geht auf rs485 umbauen.

Ich bekomme alle Schnittstellen nur immer über die Rx/Tx pins zum laufen 
obwohl ich explicit andere Pins angebe.

z.b
Open comC.1
SerialIn/Out
Das ganze darf nicht warten wie bei Input und Co....

Bitte in Bascom

von Timmo H. (masterfx)


Lesenswert?

Schau dir mal den Abschnitt Software UART an: 
http://avrhelp.mcselec.com/index.html?uart.htm

von g457 (Gast)


Lesenswert?

> Ich bekomme alle Schnittstellen nur immer über die Rx/Tx pins zum laufen
> obwohl ich explicit andere Pins angebe.

Wie meinen?

Schau Dir mal die AVR305 an.

von tottootto (Gast)


Lesenswert?

Und 485 laeuft mit luft und liebe oder wat?

Ich hol schonmal das popcorn raus...

von Chriss (Gast)


Lesenswert?

wenn ich z.b
Open "comc.0:19200,8,n,1" For Input As #2
angebe und ich was sende an den RX/TX von den atmega32 dann zeigt er mir 
das an obwohl ich nix mit bound e.c.t angegeben habe also HW nicht 
konfig.
egal was ich sag er zeigt mir immer alles an was bei RX/TX ankommt und 
nicht was bei C0 ankommt.

mmm schlecht beschrieben ich weis... keine nerven mehr

von Peter D. (peda)


Lesenswert?

Soll die SW-UART einigermaßen jitterfrei sein und gepuffert, gehen nur 
bestimmte Pins, vorzugsweise der ICP1 als RXD und OC1A als TXD.

Beitrag "Software UART mit FIFO"


Was gefällt Dir nicht am ATmega324?


Peter

von Norbert S. (norberts)


Lesenswert?

Hi,

das Problem ist in Zeile 42 vom Quellcode.

Gruß,
Norbert

von Chriss (Gast)


Angehängte Dateien:

Lesenswert?

Soo nun habe ich nach suchen und versuchen es nun zum laufen bekommen
Mehr oder weniger, Daten senden und Empfangen gehen in allen Richtungen
Nur 2 probs habe ich wobei ich erst mal das erste Public mache.

Also, zum prb:
Wenn ich bei chip1 Daten sende do loop und keine waitms 20 oder so mache 
dann bekomme ich beim Chip2 der in mom nur empfängt datenübelappungen
Ich sende „Count_x“ x geht von 0 – 65535 das ganze wird als string 
gesendet

Nun wenn ich die Daten zu schnell sende kann es vorkommen das eine zahl 
am Ende stehen bleibt, dachte erst es liegt am Display aber auch durch 
manuell cls über Button z.b geht es nicht weg, es scheint mir ein Daten 
prb oder performenc prb zu sein glaube ich, denn wenn ich ne pause von 
>10 ms nach dem Senden mache geht es immer....

Im Anhang der emfangs-teil kann mal jemand drüber gucken ob jemanden was 
aufällt

PS: bitte obiges beachten wieso ich 2 Chips verwende also kein 
Hartware-UART e.c.t vorschlagen.

Gruß
  Chriss

von Chriss (Gast)


Lesenswert?

meinte natürlich:
„Count_x“ x geht von 1 – 65535...
wegen 0 = Null / inkey

von Norbert S. (norberts)


Lesenswert?

Hi,

sorry, Deine Beschreibung versteht keine Sau.

Was mir aufgefallen ist:
---------------------
Dim Daten As String * 254
Dim Bdaten(254) As Byte At Daten Overlay
Dim Anzahl As Byte
---------------------
und später:
---------------------
Incr Anzahl
Bdaten(anzahl) = Zeichen
---------------------

Sagen wir mal, der String Daten fängt bei Adresse 0 an.
Dann ist der String an den Adressen 0-253.
In Adresse 254 steht die Länge des Strings.
Anzahl rauscht von 0-255 durch.
Das Array Bdaten ist definiert von Index 1 bis 254 und dieses liegt auf 
den Adressen 0 bis 253.

Bei Anzahl = 0 schreibst Du "Zeichen" in irgendeine Variable an der 
Adresse -1, vor dem Array denn Bdaten(0) gibt es nicht.
Bei Anzahl = 255 überschreibst Du die Länge des Strings.

Gruß,
Norbert

von Chriss (Gast)


Lesenswert?

ja, weil 0 gibt es als Array-index bei BASCOM nicht deswegen beginn ich 
bei 1 im array-index

von Norbert S. (norberts)


Lesenswert?

Hi,

das ist doch kein Chat hier.
Beschreib doch bitte mal, was da genau passiert im Gegensatz zu dem, was 
Du erwartest.

Stimmt, erst incr und dann das Array.
Kommt denn da auch oft genug die 13 an, damit Anzahl wieder zurück 
gesetzt wird bevor es überläuft?
Was sendest Du genau?
Speck die Sendesoft mal so weit ab, daß sie noch funktioniert und das 
Problem immer noch auftritt und poste das dann.

Das ist alles relativ banal aber wenn Du nicht genau beschreibst was Du 
da machst und was passiert, kann man Dir nicht wirklich helfen.

$crystal = 16000000
Das ist hoffentlich ein mindestens ein Keramikresonator?

Gruß,
Norbert

von Chriss (Gast)


Angehängte Dateien:

Lesenswert?

Aktuell ist es so:

Ich will einfach Daten von a nach b senden mit max Geschwindigkeit bzw. 
wichtiger ohne Datenverlust

So sendet der eine Chip die Daten z.b

dim a as long
Do
  Dim b as string *254
  a=a+1
  B=”Count_” + str(a)
  Print b
  waitms 20
Loop

Sooo ich habe nun eine Prüfung bei der Empfangs-routine eingebaut, das 
die anzahle nicht über 254 gehen kann bzw. sollte das auftreten wird mir 
das angezeigt am Display (Index ERR).

Sende ich nun die Daten ohne waitms dann wird Index ERR angezeigt oder 
es bleiben zeichen am ende stehen die wiederum mit kürzeren 
zeichen-längen überschrieben werden. Daraus schließe ich das die Daten 
nicht korrekt ankommen oder er zu wenig 13er zeichnen erkennt, die 
jedoch autom. Mit dem print Befehl gesendet werden.

Den String (Testdaten) die ich sende sind max 30 zeichnen...

von Peter D. (peda)


Lesenswert?

Chriss schrieb:
> Ich will einfach Daten von a nach b senden mit max Geschwindigkeit
...
> waitms 20

Guter Witz.
9600Baud sind 1,5ms + 20ms Wartezeit ergibt nur 7% der max 
Geschwindigkeit.

Das Problem wird sein, daß die SW-UART des Bascom ungepuffert ist und 
daher Daten verliert.


Peter

von Norbert S. (norberts)


Lesenswert?

dim a as long
Do
  Dim b as string *254
  a=a+1
  B=”Count_” + str(a)
  Print b
  waitms 20
Loop

Das ist garantiert nicht das was sendet.
a as long und zählt bis ins Nirwana, Dim in der Schleife...

Die LCD-Routine dauert zu lang und dann verpasst das Moped Zeichen, das 
könnte der Fehler sein.

Gruß,
Norbert

von Chriss (Gast)


Lesenswert?

habe das anzeigen mal raus nur bei dem fehler (index err) nicht, aber 
selbst das nuzte nichts, könnte es evtl an inky liegen ?

Zitat:

Wenn ein Zeichen im zwei Byte großen UART-Buffer steht, dann gibt INKEY 
ein Zeichen zurück. Steht nichts mehr im UART-Buffer, dann gibt INKEY 
die Zahl 0 zurück....

Zitat-ende

verkettung ungünstiger ereignisse Max 2 byte inkey buffer, lcd time ifs, 
und mehr zeichen senden als 2 bytes und sehr schnell ??????

mmmm ich weis net aber ich denk mit bascom werd ich nicht glücklich...
ich weis net ma ob atmega-chips das richtige ist für meine projekt... 
vorstellungen alles machen zu können/ grenzenlos

von Norbert S. (norberts)


Lesenswert?

Hi,

das ist natürlich nicht grenzenlos.

Liest Du eigentlich Deine Beschreibungen selbst nochmal durch?
Wer soll das Kauderwelsch denn verstehen?

Du musst eben wissen, was in Bascom mit diesen höheren Funktionen geht 
und was nicht. Vieles geht nicht und dann ist etwas Handarbeit und 
Datenblatt lesen angesagt.
Wenn Du mit Bascom nicht glücklich wirst, dann nimm C und mach alles zu 
Fuß.
Könntest Du zwar auch in Bascom aber das ist Dir überlassen.
In Bascom musst Du nur eben mehr Hand anlegen wenn es zeitkritisch ist, 
die lahmen Sachen gehen dagegen sehr bequem.

Wenn Du fertige Libs in C benutzt hast Du aber das selbe Problem. Die 
brauchen ihre Zeit, nutzen ev. Timer usw..
Genau wie in Bascom.
Wenn Du volle Controlle haben willst, musst Du alles selbst zu Fuß 
machen. Bei einigen Dingen geht es kaum anders, ob nun Bascom oder C. 
Bei anderen braucht man das nicht, dann ist es auch egal welche Sprache.

Auch mit Bascom muß man das Datenblatt lesen, auch wenn das für die 
erste blinkende LED auch ohne geht.

Gruß,
Norbert

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.