Forum: Mikrocontroller und Digitale Elektronik Brauche Hilfe bei Projektarbeit


von Miriam W. (miriamw)


Lesenswert?

Hallo zusammen,

ich bin Miriam,22 Jahre alt und studiere im 3. Semester Elektrotechnik. 
Schlage mich zur Zeit mit meiner Projektarbeit rum.

Ich muss zwei µC (ATMega32) über ein 25m langes Koaxkabel miteinander 
verbinden. Der eine µC liest zwei analoge Signale von 0-5V über die 
ADC-Eingänge PA0 und PA1 ein, übernimmt eine erste Verarbeitung 
(entfernen des Offsets) und soll dann die Werte an den zweiten µC 
übermitteln.
Der zweite µC hat im wesentlichen dann die Aufgabe, dass Signal auf 
RS232-Pegel umzusetzen um es somit in einen PC zu speisen um es dort 
anzuzeigen. Zu diesem Zweck wollte ich einen zusätzlichen IC einsetzen, 
den MAX232.

Jetzt zu meinen eigentlichen Fragen:

1. Kann ich überhaupt über die 25m mit einem Spannungssignal arbeiten, 
oder sollte ich hier noch mit einem Umsetzer auf 4-20mA übertragen?

2. Bietet der µC die Möglichkeit eier Übertragung mit Fehlererkennung 
ohne weiteren Programmieraufwand?

4. Habe den Quellcode für den ersten µC geschrieben. Habe allerdings 
noch zwei Fehlermeldungen.
Hier der Code:
1
#include <avr/io.h>
2
#include <stdint.h>
3
4
void uC_init (void){
5
6
  DDRA  = 0x00;
7
8
}
9
10
11
void adc_init(void) { // ADC initialisieren
12
13
  uint16_t result;          // Variable result deklarieren
14
15
  ADMUX = (0<<REFS1) | (1<<REFS0);    // AVcc als Referenz benutzen
16
  ADCSRA |= (1<<ADEN) | (1<<ADPS2) | (1<<ADPS0); // ADC-Takt = 115,2kHz
17
18
  /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
19
     also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
20
21
  ADCSRA |= (1<<ADSC);                // starte eine ADC-Wandlung zur Initialisierung
22
  while (ADCSRA & (1<<ADSC) ) {}      // auf Abschluss der Konvertierung warten
23
  
24
  result = ADCW;
25
26
}
27
28
29
/* ADC Temperatur- und Druckmessung */
30
uint16_t ADC_READ( uint8_t channel ){
31
  
32
  uint16_t zaehler;
33
34
  ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F); // löscht alte Werte in MUX0-MUX4 und schreibt neuen Wert in selbige 
35
  
36
    while (zaehler < 500){      // Warteschleife von ca. 135µs, empfohlen sind 125µs
37
    zaehler++;
38
39
40
  zaehler = 0;            // Zähler zurück setzen
41
  
42
    ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
43
   while (ADCSRA & (1<<ADSC) ) {}  // auf Abschluss der Konvertierung warten
44
    return ADCW;                    // ADC auslesen und zurückgeben
45
}
46
47
48
49
int main (void) {
50
    
51
  uint16_t temp;
52
  uint16_t press;
53
54
  uC_init();
55
  adc_init();
56
57
  while(1) { 
58
  
59
  temp = ADC_READ(0);    // Kanal 0 ausgewählt
60
61
  press = ADC_READ(1);   // Kanal 1 ausgewählt
62
63
    temp = temp - 260;    // Offset von 1,27V abziehen (1,27V entsprechen 260 Bit)
64
  press = press - 48;    // Offset von 0,232V abziehen (0,232V entsprechen 48 Bit) 
65
  
66
  // Druck und Temperatur übertragen
67
  
68
  // Timer programmieren, um Wartezeit von 10s zu realisieren         
69
     
70
  }   
71
72
  return 0;
73
74
}

Hier die Fehlermeldungen:

Build started 29.3.2011 at 15:58:13
avr-gcc  -mmcu=atmega32 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char 
-funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT 
Messwerterfassung_Boot.o -MF dep/Messwerterfassung_Boot.o.d  -c 
../Messwerterfassung_Boot.c
../Messwerterfassung_Boot.c: In function 'ADC_READ':
../Messwerterfassung_Boot.c:49: warning: 'main' is normally a non-static 
function
../Messwerterfassung_Boot.c:74: error: expected declaration or statement 
at end of input
make: *** [Messwerterfassung_Boot.o] Error 1
Build failed with 1 errors and 1 warnings...


Der Code ist noch nicht komplett, fehlt, wie aus der Kommentierung 
ersichtlich, noch die Programmierung eines Timers um eine Übertragung 
alle 10s zu realisieren und die Übertragung an sich.

Ich hoffe ihr könnt mir helfen, die Jungs trauen mir leider praktisch 
nicht so viel zu, aber das sehe ich als Herrausforderung.
Ist es eurer Meinung nach überhaupt machbar bis zum 08.04.?

glg, Miri

von Junge (Gast)


Lesenswert?

warum den eigentlich 2 MCUs? Einer würde doch reichen und RS232 sollte 
dann schon über 25m gehen...

von Junge (Gast)


Lesenswert?

ähmm zum Compilerfehler: es fehlt eine geschweifte Klammer in ADC_READ, 
wenn ich es richtig sehe...

von AVerr (Gast)


Lesenswert?

Miriam Weiß schrieb:
> 2. Bietet der µC die Möglichkeit eier Übertragung mit Fehlererkennung
> ohne weiteren Programmieraufwand?

Nein, Fehlererkennung musst du schon selbst einbauen. Wie genau soll sie 
denn sein ?
Ein- bzw. Zweidimensionale Parität ist ja noch recht einfach zu 
implementieren. CRC würde schon etwas ( nur ein wenig, keine Sorge ) 
komplizierter werden.


Zu den Fehlermeldungen:
In ADC_READ hast du folgende Zeile:
1
while (zaehler < 500){
aber die geschweifte Klammer wird nie geschlossen. Ich tippe mal darauf, 
dass nach der Zeile "zaehler++;" die Klammer geschlossen werden sollte.

Miriam Weiß schrieb:
> Ist es eurer Meinung nach überhaupt machbar bis zum 08.04.?

Ich denke, dass das sogar noch recht gut machbar ist in der Zeit.

von Jannis C. (kabelwurm)


Lesenswert?

Hallo,
machbar ist das sicherlich.
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART
Das sollte dir dabei helfen, die Verbindung hinzubekommen.
Zu den Fehlern kann ich dir leider nicht wirklich was sagen. Dafür bin 
ich noch zu sehr Anfänger.
Was mir aber aufgefallen ist, ist das du für das Initalisieren der Ports 
eine eigene Funktion geschrieben hast. Das brauchst du nicht. Schreib es 
unter die Headeratein, genauso wie deine Variablendeklarationen. Ist 
sehr viel Übersichtlicher.
Gruß Jannis

von Philipp (Gast)


Lesenswert?

>Was mir aber aufgefallen ist, ist das du für das Initalisieren der Ports
>eine eigene Funktion geschrieben hast. Das brauchst du nicht. Schreib es
>unter die Headeratein, genauso wie deine Variablendeklarationen. Ist
>sehr viel Übersichtlicher.

Anweisungen, wie die Initialisierung der Ports, ist außerhalb einer 
Funktion/Prozedur überhaupt nicht lauffähig. Da sollte der Compiler auch 
gar nicht erst ne binary ausspucken.
Und globale Variablen solltest du auch lieber vermeiden, wenn sie nicht 
unbedingt gebraucht werden.
Wenn du mal an einem größeren Projekt arbeitest, und du feststellst, das 
eine Variable nicht den gewünschten Wert hat wirst du froh sein, wenn du 
den Fehler auf nen bestimmten Bereich eingrenzen kannst.

von Bastler (Gast)


Lesenswert?

Junge schrieb:
> warum den eigentlich 2 MCUs? Einer würde doch reichen und RS232 sollte
> dann schon über 25m gehen...Beitrag melden | Bearbeiten | Löschen |

Wegen Aufgabenstellung?

Gibt es an die Datenübertragungsgeschwindigkeit besondere Anforderungen?

Nicht zu schnelles RS232 geht über die Entfernung, ist aber viel Aufwand 
für Pegelwandler.

Als unkonventionelle Lösung könnte man evtl. mit dem Ausgang des 
messenden uC über das lange Kabel eine LED betreiben, die direkt beim 
Empfänger sitzt (Optokoppler).
Vorteile: wenig Aufwand, Galvanische Trennung, störsicher
Nachteil: nicht standardisiert, langsam (Kapazität des Kabels muß erst 
über LED-Vorwiderstand umgeladen werden)

von Miriam W. (miriamw)


Lesenswert?

Jungs ihr seid spitze...:) Ganz lieben Dank an euch.
Habe ja schon mit Kommentaren wie typisch Frau gerechnet...:D

Also, der Fehler war tatsächlich die geschweifte Klammer, Danke nochmals 
an dieser Stelle. Das hätte mir auch selbst auffallen sollen, aber 
irgendwie habe ich nach ner halben Stunde den Überblick verloren...


Junge schrieb:
> warum den eigentlich 2 MCUs? Einer würde doch reichen und RS232 sollte
> dann schon über 25m gehen...

Ich brauche 2µC, weil ich eine Fehlererkennung durchführen möchte/soll 
und vom ersten µC nur zwei Leitungen (1 Koaxkabel)für die Übertragung 
zur Verfügung stehen. Für RS232 werden doch meines Wissens (habe mich da 
noch nicht richtig schlau gemacht) 3 Leitungen benötigt...??!??


Was die Fehlererkennung anbelangt, denke ich, dass eine zweidimensionale 
Parität ausreichen sollte. Gibts dazu hier irgendwo einen Sticky, wo 
dies näher erläutert wird?

Und dann hab ich noch eine Frage zur Initialisierung.
Muss ich, wenn PORTA als ADC genutzt wird die Pull-Ups auch aktivieren?

Sollten die beiden µC auch über die UART-Schnittstelle kommunizieren?


Danke an alle...Ihr seid supi..:)

glg, miri

von chris (Gast)


Lesenswert?

Ich würden nur eine CPU verwenden, welche am Coax sitzt und am anderen
Ende (PC) einen max232 oder equivalent zum PC.
Fehlererkennung, AVR sollte parity generieren und PC sollte dann parity
checken, dann hat man auch eine Fehlererkennung der Übertragung mit 
wenig
Aufwand, sogar viel weniger als einen zweiten uC sowie ein eigens 
definiertes Protokoll dazwischen.

von Karl H. (kbuchegg)


Lesenswert?

Miriam Weiß schrieb:

> Also, der Fehler war tatsächlich die geschweifte Klammer, Danke nochmals
> an dieser Stelle. Das hätte mir auch selbst auffallen sollen, aber
> irgendwie habe ich nach ner halben Stunde den Überblick verloren...

Stell deine Einrückungen richtig, zieh ein einziges Klammernschema 
konsequent durch. Dann passieren dir solche Dinge deutlich weniger oft 
und wenn, dann findet man sie leichter.

von Karl H. (kbuchegg)


Lesenswert?

Miriam Weiß schrieb:

> Ich brauche 2µC, weil ich eine Fehlererkennung durchführen möchte/soll
> und vom ersten µC nur zwei Leitungen (1 Koaxkabel)für die Übertragung
> zur Verfügung stehen. Für RS232 werden doch meines Wissens (habe mich da
> noch nicht richtig schlau gemacht) 3 Leitungen benötigt...??!??

Kommt drauf an.
Wenn es eine Einwegkommunikation ist, kommt man auch mit Standard-RS232 
mit 2 Leitungen (Transmit und GND) durch.

> Und dann hab ich noch eine Frage zur Initialisierung.
> Muss ich, wenn PORTA als ADC genutzt wird die Pull-Ups auch aktivieren?

Wozu?
Du willst doch eine Spannung messen. Wenn du da noch einen Pullup 
dazuschaltest, dann hast du einen Spannungsteiler, gebildet aus Pullup 
und deiner externen Beschaltung, von der du 1 Widerstand (den Pullup) 
noch nicht einmal exakt im Wert kennst.

> Sollten die beiden µC auch über die UART-Schnittstelle kommunizieren?

Für eine Einwegkommunikation reicht das.
Wenns hin und her gehen soll, musst du dir was anderes einfallen lassen. 
Denn: Du hast ja nur 1 Leitung auf der beide Senden können müssen.

von heinzhorst (Gast)


Lesenswert?

Also bei echter echten Fehlererkennung kommst du nicht um einen zweiten 
Controller drum herum. Ich denke, aber drauf kann man hier verzichten. 
Oben hast du geschrieben, dass der Empfänger die Daten nur an einen PC 
übertragen soll und keine Steuersignale oder Ähnliches zurücksendet. 
Also erfolgt die Datenübertragung nur  eine Richtung, oder? Prinzipiell 
ist eine differenzielle Übertragung störsicherer als eine unsymmetrische 
Übertragung (lernst du später noch in Leitungstheorie). So etwas kann 
man z.B. mit einem MAX485 machen. Dann würde ich das Ganze 
folgendermaßen aufbauen:

ATMega -> MAX485 -> 25m Leitung -> MAX485 -> MAX232 -> PC

von Peter D. (peda)


Lesenswert?

Miriam Weiß schrieb:
> Ich muss zwei µC (ATMega32) über ein 25m langes Koaxkabel miteinander
> verbinden. Der eine µC liest zwei analoge Signale von 0-5V über die
> ADC-Eingänge PA0 und PA1 ein, übernimmt eine erste Verarbeitung
> (entfernen des Offsets) und soll dann die Werte an den zweiten µC
> übermitteln.

Der erste benutzt also insgesamt 3 IO-Pins, was macht er mit den 
restlichen 29?
Und wozu 32kB, das Programm wird schätzungsweise max 1kB groß.


Peter

von Miriam W. (miriamw)


Lesenswert?

Super,

echt beeindruckend wie viel Antworten hier kommen... Danke!

@ Karl Heinz Buchegger: Bzgl den Einrückungen werde ich in Zukunft 
beachten, hat uns unser Prof auch immer eingebläut im letzten 
Semester... :)
Die Kommunikation ist einseitig, also sollte es über UART gehen.

@ Peter: Hast natürlich Recht, der µC ist für diesen Zweck eindeutig 
unterfordert. Aber der flog noch bei uns im Labor rum, wurde also nicht 
extra gekauft...;)



Was die Übertragung angeht bin ich jetzt ein bisschen verunsichert. Wo 
ihr sicherlich recht habt, ist, dass ich mir dren µC auf Empfangsseite 
sparen kann, da eine Fehlererkennung ja auch mit dem PC durchgeführt 
werden kann.

Fraglich ist jetzt nur, ob ich es so machen soll wie Chris gesagt hat:
ATMega -> 25m Leitung -> MAX232 -> PC

oder so wie heinzhorst:
ATMega -> MAX485 -> 25m Leitung -> MAX485 -> MAX232 -> PC

Ich denke die zweite Variante hätte den Vorteil, dass die Übertragung 
nicht so fehleranfällig ist. Die erste Variante wäre wahrscheinlich 
schneller zu realisieren.

Gibts dazu weitere Meinungen?

Lese mich gerade in die Thematik ein, daher entschuldigt bitte meine 
Unwissenheit. Wenn wir mehr als zwei Wochen Zeit gehabt hätten, wäre es 
sicherlich leichter gewesen....

Danke an euch!

glg, Miri

von Blackbird (Gast)


Lesenswert?

Wenn schon, dann so:
ATMega -> MAX232 -> 25m Leitung -> PC


Der MAX232 mit seinen -/+10V-Pegeln ist störsicherer (und außerdem 
kurzschlußfest) als der ATMega mit seinen +5V-TTL-Pegel.

Blackbird

von Rumpelstilzchen (Gast)


Lesenswert?

Ich würde es so machen, wie es heinzhorst beschrieben hat.
Über den RS485 Link kannst du bidirektional Daten übertragen, das ganze 
ist sehr störsicher und trotzdem relativ einfach.

Dass man für "echte" Fehlererkennung einen zweiten Controller braucht, 
verstehe ich nicht. Ein Parity Check ist eine echte Fehlererkennung 
(wenn auch nicht sehr leistungsfähig) und die kann der PC auch.

Wenn du es wirklich zuverlässig haben willst, dann erstell dir einen 
Code mit möglichst großer Hamming-Distanz und schick die Daten so 
codiert rüber. Da kannst du (je nach Hamming-Distanz) ziemlich viele 
Bit-Fehler erkennen und sogar korrigieren.
Das sicherste ist es jedoch, defekte Datenpakete einfach nochmal neu 
anzufordern. So ist man immer auf der sicheren Seite.

http://de.wikipedia.org/wiki/Hamming-Abstand

@Peter: Man kann für diese Aufgabe auch einen 144Pin Controller mit 
256kB Flash nehmen. Der Sinn der Aufgabe liegt wohl in der Realisierung 
der Datenstrecke und nicht im möglichst effizienten Ausnutzen von 
Controllern. btw, nen ATTiny zu kaufen ist immer noch teurer und 
ineffizienter, als vorhandenes Material zu nutzen!

von Blackbird (Gast)


Lesenswert?

Nachtrag:
die Baudrate auf 1200 (oder kleiner) setzten und schon gehen auch 
größere Entfernungen (gibt's irgendwo auch eine Tabelle).

Blackbird

von Blackbird (Gast)


Lesenswert?

@Rumpelstilzchen (Gast),
es soll bis 08.04. fertig sein, getestet und laufen. Fehlererkennung 
kann man immer noch als Update später reinbrennen.

Blackbird

von Rumpelstilzchen (Gast)


Lesenswert?

@Blackbird: Das mit dem Hamming-Code war auch nur als Anregung gedacht, 
um vlt. ein paar Zusatzpunkte einzuheimsen ;D Deswegen auch meine 
Anmerkung, dass der Parity Check zur Fehlererkennung reichen sollte.

von Miriam W. (miriamw)


Lesenswert?

Hey, wieder mal viele gute Anregungen.

Also, ich werde es jetzt so machen wie von heinzhorst vorgeschlagen:
ATMega -> MAX485 -> 25m Leitung -> MAX485 -> MAX232 -> PC

Werde mir jetzt mal die Datenblätter des MAX485 und des MAX232 genauer 
anschauen. Hoffentlich funktioniert es mit 12V, da ich auf Senderseite 
nicht mehr Spannung zur Verfügung habe...

Hat jemand das schonmal so in der Form gemacht? Also MAX485 mit MAX232 
gekoppelt? Habe da jetzt bisher bei meiner Recherche nur ein fertiges 
Bauteil gefunden. Aber das will ich nur ungerne verwenden, da ich bei 
der ganzen Sache ja auch noch was lernen will.

Die Fehlererkennung werde ich erst zum Schluss einfügen, wenn soweit 
alles läuft, guter Einwand...:)

Danke nochmal an alle. Weiß das wirklich zu schätzen.

glg, Miri

von Christian P. (pfoertner)


Angehängte Dateien:

Lesenswert?

Hallo Miriam,

also wegen den ob 12V reichen solltest
du dir keine gedanken machen der RS485 und
der RS232 sind beides 5V- Bauteile.

Zur Kopplung RS485 auf RS232 habe folgendes
(siehe Anhang).


Ich hoffe das Hilft dir weiter.

Gruß

Christian

von raketenfred (Gast)


Lesenswert?

Hi, mach dir mal nicht so einen Kopf um die Übertragung.

ich habe hier ein 5m Kabel ungeschirmt neben einem Lan-Kabel liegen. Ein 
Max232 wandelt vor dem Kabel auf 5V um, und auch die Spannungsversorgung 
liegt parallel. Die Platine schaltet ein Relais auf Kommando vom PC und 
gibt Bestätigung, obwohl größere Pufferkondensatoren und vernünftige 
Beschaltung fehlen, habe ich bis jetzt noch keinen Datenfehler mir 
eingehandelt!

Da es ein max 10bit-Wert ist und der alle 10s übertragen werden soll, 
würde ich einfach mit 2bit/s übertragen, sofern der PC das schafft.

1. Soviel Spannung wie möglich darein knallen in die Leitung.(DIe 
größere Kraft gewinnt- das kennste wahrscheinlich durch das Machogehabe 
bei dir ;-) )
2. So schnell wie nötig
3. So langsam wie möglich

von Miriam W. (miriamw)


Angehängte Dateien:

Lesenswert?

Danke Christian, das werde ich mir gleich noch anschauen...:)

Aber habe jetzt noch ein paar Fragen an euch Profis. Habe jetzt die 
ganze Zeit damit verbracht, mich über RS232 schlau zu machen, da ich 
mich jetzt doch dazu entschlossen habe, dass Projekt wie folgt 
anzugehen:

ATMega -> MAX232 -> 25m Leitung -> PC

Habe sonst echt ein bisschen Schiss, dass ich mit der Zeit nicht 
hinkomme. Wenn es so nicht funktionieren sollte, werde ich es wie von 
heinz vorgeschlagen umsetzen.

Zu meinen Fragen:
In der PDF habe ich eine Schaltung gefunden, wie der MAX232 an den 
9-poligen SUB-D-Stecker angeschlossen werden soll. Allerdings ist hier 
eine Kommunikation in beide Richtungen möglich, welche ich nicht 
benötige.

PIN2 (RxD = Receive Data) des SUB-D wird daher nicht benötigt.

PIN3 (TxD = Transmit Data) muss natürlich angeschlossen werden, damit 
ich über diese Leitung meine Daten senden kann.

PIN6 ist meiner Recherche nach falsch angeschlossen, da die Masse auf 
PIN5 gehört, richtig?

PIN7 (RTS = Request to Send) kann ich auch nicht anschliessen.

PIN8 (CTS = Clear to Send) wird ebenfalls nicht angeschlossen.


Was mir jetzt nicht ganz klar ist, wie ich PIN7 und PIN8 des MAX232 
beschalten muss. Ich denke mal, dass ich PIN7 (worüber die Sendeanfrage 
übermittelt wird) nicht beschalten muss, und an PIN8 (worüber die 
Sendeerlaubnis empfangen wird) eine Spannung größer +3V anlege, um zu 
realisieren, dass der DCE (Empfänger) eine Sendeerlaubnis gegeben hat. 
Dadurch ist der DCE also die ganze Zeit empfangsbereit.

Dann sollte es mir doch möglich sein, mittels Terminalviewer meine Daten 
zu empfangen und entsprechend zu visualisieren?!

Hoffe ich liege jetzt nicht ganz falsch, hab aber irgendwie ein gutes 
Gefühl. So, für heute reichts, morgen wieder um 8 Vorlesung... Bin froh, 
wenn das Projekt geschafft ist...

lg und ute Nacht, Miri

von Christian P. (pfoertner)


Lesenswert?

Hallo Miriam,

also erstmal hast du recht nicht Pin6
sondern Pin5 gehört an GND.

Zu Pin7 und Pin8 also den Hardware-
Handshakeleitungen. Wenn du das in
deinem PC- Programm nicht nutzt kannst
du die weg lassen. Wenn das PC- Programm
das braucht und dein ATmega dieses nicht
auswerten soll kannst du RTS und CTS
einfach Brücken.

Gruß

Christian

von Blackbird (Gast)


Angehängte Dateien:

Lesenswert?

Ausgehend vom Bild im Anhang:

1. Beschaltung der 5 Cs (0,1µF) wie im Bild
2. Pin11 (oder Pin10) zum ATMega32 an Pin15 (PD1, TxD)
3. Pin14 (oder Pin7) über einen Schutzwiderstand von ca. 50 bis 100 Ohm 
an den Innenleiter der 50Ohm-Leitung, Pin15 des MAX232 und alle GND des 
ATMege an den Schirm der 50Ohm-Leitung.

... fertig ist die µC-Seite.

Auf der anderen Seite der 50Ohm-Leitung:

1. Innenleiter der 50Ohm-Leitung an Pin2 eines RS232-Steckers. (keine 
Buchse)
2. Schirm an Pin5

... fertig ist die PC-Seite.

Zum PC ein RS232-Cross-Over-Kabel ("Null-modem"-Kabel mit gekreuzten 
Leitungen 2 auf 3 und 3 auf 2)

Blackbird

von Miriam W. (miriamw)


Lesenswert?

Hey,

Danke an euch alle. Hab mir leider eine kräftige Grippe eingefangen und 
lag am WE komplett flach. Habe die Bauteile alle soweit bestellt. Hoffe, 
dass sie am Mittwoch ankommen und ich alles löten kann. Unsere Gruppe 
hat eine kleine Fristverlängerung bis zum 15.04. bekommen. Das ist 
gut...:)

Also dann, werde euch auf dem laufenden halten. Und nochmals vielen Dank 
an euch alle Jungs!

glg, Miri

von Miriam W. (miriamw)


Lesenswert?

Hallo Jungs,

ich bin mit meinem Projekt soweit ganz gut im Zeitplan. Die Schaltung 
ist fertig gelötet und der µC programmiert.

Das einzige Proplem ist derzeit, dass ich  nicht weiß, wie ich die Fuses 
mit AVR-Studio setzten kann. Ich benutze zur Programmierung das STK500.
Um es nochmal deutich zu sagen, liegt das Problem darin, dass ich die 
Einstellmöglichkeit der Fuses nicht finde. Wie ich die Fuses setzen 
muss, meine ich zu wissen... :D
Leider finde ich dazu weder über google noch im Tutorial Informationen, 
sondern lediglich den Screenshot wo man die Einstellung vornehmen kann.

Danke für euere Hilfe.

glg, miri

von Christian P. (pfoertner)


Angehängte Dateien:

Lesenswert?

Hallo Miriam,

ich benutze zum flaschen das Tool im Anhang über das
kann man auch die Fuses einstellen.
Einfach unter "Hardware => Sonstiges" dein STK500 aus
wählen den Port eintragen, den Controller Typ auswählen
und dann unter Brennen die Fuses bearbeiten.

Gruß

Christian

von Miriam W. (miriamw)


Lesenswert?

Hallo,

habe jetzt nach langem rumtüffteln rausgefunden, wie man es mit 
AVR-Studio macht. Eigentlich ganz leicht, wenn man einmal weiß wie es 
funktioniert.

@Christian: Trotzdem Danke für deine Hilfestellung.

Habe mich aber jetzt mal prompt aus meinem Controller ausgeschlossen, 
zum Glück kann man das mit dem STK500 rückgängig machen und zur Not 
fliegen hier auch noch zwei andere µC im Labor rum.

Wenn ich das jetzt richtig verstanden habe, muss man im AVR-Studio nur 
die Einstellung wie im Screenshot ersichtlich vornehmen und AVR-Studio 
übernimmt dann die Einstellung der FUSES.
Habe folgende Einstellung gewählt: "Ext. Crystal/Resonator Medium Freq.; 
Start-Up Time: 16K CK +64ms"

Ext. Crystal/Resonator: Sollte die richtige Einstellung sein, wenn ich 
einen externen Quarz verwende, oder?

Medium Freq.: Habe ich ausgewählt, da mein Quarz einen Grundton von 
2,4576MHz hat.

Start-Up Time: Habe hier die größte Zeit gewählt

Hat jemand vllt eine Ahnung was ich falsch gemacht habe?
Oder kann es auch am STK500 liegen, dass ich irgendwelche Jumper falsch 
gesetzt habe?

glg, miri

von Miriam W. (miriamw)


Angehängte Dateien:

Lesenswert?

Sorry,

habe den Screenshot vergessen.

von Uwe (Gast)


Lesenswert?

Da ich kein STK500 besitze kleine frage hat das Board den Quarz 
gesockelt und da haste deinen Quarz reingesteckt ?

Mal im Datenblatt des Quarzes gucken was für Kapazitäten empfolen werden 
und was auf dem STK drauf ist. Vieleicht schwingt er deshalb nicht an.

Jumper richtig setzen für Crystal ->

http://www.atmel.com/dyn/resources/prod_documents/doc1925.pdf Seite 
30-31

Die Note ist auch ganz interressant ->

The STK500 has eight different AVR sockets connected to the same clock 
system. The long signal lines in this system makes it difficult to drive 
a crystal with the On-chip Oscillators on the AVR.

von Markus R. (maggus)


Lesenswert?

Unter Projekt -> Configuration Options die richtige Frequenz 
eingestellt?
Wenn du keinen JTAG-Adapter angeschlossen hast, das Häkchen bei JTAGEN 
wegmachen.
Wird irgendwas übers USART gesendet?

von Uwe (Gast)


Lesenswert?

nach Manual vom STK benutzt das STK also nicht den internen Oszilator 
also der inverter sonder hat einen Externen an dem der eingesteckte 
quarz dranhäng (zumindest nach dem Manual) siehe figure 3-30 ->
also ist nicht crystal einzustellen sondern externer oszilator !!!

von Miriam W. (miriamw)


Lesenswert?

Also, will den µC mit dem STK500 ja nur flashen und dann in meine 
bestehende Schaltung integrieren. Dort ist dann auch mein Quarz verbaut 
mit 2,4576MHz. Habe allerdings noch einen zweiten, den ich auch im 
STK500 anwenden kann, falls das überhaupt notwendig ist.

Jedenfalls konnte ich den Controller auslesen, bevor ich folgende 
Einstellung vorgenommen hatte:
"Ext. Crystal/Resonator Medium Freq.;Start-Up Time: 16K CK +64ms"

Wenn ich jetzt auf "Read" klicke, kommt die Fehlermeldung "ISP Mode 
Error".
Weiß grad garnicht weiter... :(

@Markus: Frequenz habe ich nachgetragen. Habe keinen JTAG-Adapter 
angeschlossen und das Häkchen somit entfernt. Danke für die Tips!

Über USART will ich nachher auf meiner Anwendungsplatine die Messsignale 
an meinen Schnitstellenbaustein übergeben, aber was hat das mit dem 
flashen zu tun...Blick echt nicht durch grad.

Man, man, man, hab mich schon gefreut, dass ich heute evtl. fertig 
werde. Morgen muss es spätestens laufen...:(

glg, miri

von Christian P. (pfoertner)


Lesenswert?

Hallo Miriam,

wenn das STK500 keinen Quarz hat und du den
Internen RC abschaltest. Kann der Controller
ohne Quarz nicht mehr arbeiten.
Das heißt du musst ins STK500 einen Quarz
einsetzen.

Gruß

Christian

von Uwe (Gast)


Lesenswert?

@ Christian Pförtner -> GENAU aber :
Das STK500 hat nach der Zeichnung im Manual einen Quarz(Sockel?) und 
damit dieser läuft einen Oszilator(also EXRTA!!! IC),weil die 
Leiterbahnen zum AVR sehr lang sind und es so zu Problemen kommen kann. 
Das heißt also das der AVR nur am XT1 Pin angeschlossen ist.
Ein Quarz wird zwischen XT1 und XT2 angeschlossen (natürlich mit 
entsprechen Kapazitäten so 22pF) die Fuses auf external 
Crystal/resonator programmiert.
So sollte auch die selbstgebaute Schaltung von Miriam gebaut sein und so 
müssen die Fuses gesetz sein.
Das STK braucht aber die Fuses auf External Clock gesetz da der 
Oszilator auf der platine den inverter und die beiden kondensatoren 
besitzt um den Quarz zum Schwingen zu bringen.
Die Fuse Einstellungen auf dem STK500 sind mit den Fuse Einstellunge der 
Eigenen Schaltung inkompatibel.

Siehe Manual figure 3-30 Seite 32
http://www.atmel.com/dyn/resources/prod_documents/doc1925.pdf

man könnte versuchen Jumper XTAL rauszumachen und am Expansionstecker 
zwischen XT1 und XT2 den Quarz zu stecken (natürlich mit 22pf 
kondensatorn an den XT1 u. XT2 zu Masse nahe beim Quarz.
Dann hätte man die gleiche Fuse Konfiguration und die einstellungen 
wären kompatibel. (falls die Leitungslängen einem keinen Strich durch 
die Rechnung machen)

von Miriam W. (miriamw)


Lesenswert?

Hallo grüßt euch alle...

Haben heute die Abschluspräsentation gehalten, auch wenn wir unser 
Projekt nicht komplett abgeschlossen haben. Theoretisch erörten konnte 
ich es dann schon.

Auch wenn es jetzt für meine Note nicht mehr relevant ist, möchte ich 
die ganze Sache trotzdem zum laufen bekommen, netter Weise habe ich 
immer noch Zugang zum Labor.

Mit dem flashen des µC hat es jetzt im Nachhinein geklappt, lag an der 
Jumperstellung, welche den Quarz auswählt. Konnte jedenfalls erfolgreich 
die Fuses und das Programm ohne Fehlermeldung auf den µC brennen.

Habe auch schon den Schnittstellenaustein MAX232 angeschlossen. Meine 
Frage ist jetzt, wie ich die Signale jetzt in meinem Rechner auslesen 
kann. Muss jetzt über eine RS232-USB-Kupllung das Signal an einem 
USB-Port auslesen. Normale Terminalprogramme sind hierzu doch nicht 
geeignet, oder?

Oder funktioniert das überhaupt nicht?

LG, miri

von Christian P. (pfoertner)


Lesenswert?

Hallo Miri,

wenn der PC noch eine Serielle- Schnittstelle,
dann da direkt anschließen. Ansonsten einen
RS232/USB Adapter nehmen und den Treiber
installieren. Unter Gerätemanager wird der dann
angezeigt mit dem zugelerntem COM-Port der Rest
per Terminalprogramm wie gehabt.

Gruß

Christian

von Falk B. (falk)


Lesenswert?

@Miriam Weiß (miriamw)

>Auch wenn es jetzt für meine Note nicht mehr relevant ist, möchte ich
>die ganze Sache trotzdem zum laufen bekommen,

Gute Einstellung.

>Frage ist jetzt, wie ich die Signale jetzt in meinem Rechner auslesen
>kann. Muss jetzt über eine RS232-USB-Kupllung das Signal an einem
>USB-Port auslesen. Normale Terminalprogramme sind hierzu doch nicht
>geeignet, oder?

Solche Fragen im 3. Semester? Naja. . . .

Ja, USB-RS232 Umsetzt funktionieren ebenso wie Terminalprogramme 
vorzüglich für deine Aufgabenstellung.

Hab den Thread nur am Anfang gelesen, der 2. uC ist Unsinn ^3, tyisch 
akademische Aufgabenstellung. Mach deine Fehlersicherung in den 1. uC, 
der direkt per RS232 mit deinem PC spricht. Fertig. Und der Lerneffekt 
ist der gleiche, wenn nicht besser.

MFG
Falk

von dunno.. (Gast)


Lesenswert?

nur mal so btw... für eine projektarbeit an der uni <14 tage? scheint 
mir aber etwas knapp bemessen / außergewöhnlich..?

von Miriam W. (miriamw)


Angehängte Dateien:

Lesenswert?

Hallo ihr Lieben.

Irgendwie ist bei mir der Wurm drin und ich weiß nicht mehr weiter.
Habe gerade nochmal alles gecheckt aber die Sache läuft immer noch 
nicht.

Meine Hardwarebeschaltung an meinem ATMega32 sieht folgendermaßen aus:

PIN10: VCC --> 5,065V
PIN11: GND
PIN12: XTAL1 über Keramikkondensator (22pF) gegen Masse (DB Seite 26)
PIN13: XTAL2 über Keramikkondensator (22pF) gegen Masse (DB Seite 26)
PIN15: TXD geht auf T1IN des MAX232
PIN30: AVCC über 10mH mit VCC verbunden und über 100nF gegen Masse 
geschaltet (DB Seite 210)
PIN31: GND
PIN32: AREF --> Referenzspannung für ADC (5V) --> "AVCC with external 
capacitor at AREF pin" habe hier 100nF Keramik eingesetzt
PIN39: Eingangssignal Druck (1,2V - 5V)
PIN40: Eingangssignal Temperatur (1,5V - 5V)

Leider kann ich an PIN15 keine TTL-Pegel messen. Bekomme hier nur ein 
periodisches Signal welches im mV-Bereich liegt. Habe das ganze mal 
oszilloskopiert und als BMP angehängt.
Ich will auch noch mal deutlich sagen, dass ich mich nicht auf eure 
Kosten ausruhen möchte, aber ich weiß grad nicht weiter und sonst werde 
ich auch nicht betreut. Daher ist das Forum hier meine letzte Hoffnung.
Leider habe ich selbst noch nicht so viel Erfahrung :(

Vielleicht hat ja auch jemand noch Zeit über meinen Code zu gucken. Habe 
alles mit bestem Wissen und Gewissen programmiert.
1
#include <avr/io.h>
2
#include <stdint.h>
3
#include <stdlib.h>
4
5
6
void uC_init (void){
7
8
  DDRA  = 0x00;
9
10
}
11
12
13
void adc_init(void) { // ADC initialisieren
14
15
  uint16_t result;          // Variable result deklarieren
16
17
  ADMUX = (0<<REFS1) | (1<<REFS0);    // AVcc als Referenz benutzen
18
  ADCSRA |= (1<<ADEN) | (1<<ADPS2) | (1<<ADPS0); // ADC-Takt = 76,8kHz
19
20
  /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
21
     also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
22
23
  ADCSRA |= (1<<ADSC);                // starte eine ADC-Wandlung zur Initialisierung
24
  while (ADCSRA & (1<<ADSC) ) {}      // auf Abschluss der Konvertierung warten
25
  
26
  result = ADCW;
27
28
}
29
30
31
void usart_init (void){
32
   UCSRB |= (1<<TXEN);                            // UART TX einschalten
33
  UCSRC = (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0);   // Asynchron 8N1 
34
  UBRRH = 0x00;          // Wert ergibt sich aus folgender Formel
35
    UBRRL = 0x1F;          // UBRR = (Taktfrequenz/(16*Baudrate))-1=31
36
37
}
38
39
40
/* ADC Temperatur- und Druckmessung */
41
uint16_t ADC_READ( uint8_t channel ){
42
  
43
  uint16_t zaehler;
44
45
  ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F); // löscht alte Werte in MUX0-MUX4 und schreibt neuen Wert in selbige 
46
  
47
48
    zaehler = 0;          // Zähler zurück setzen
49
    while (zaehler < 500){      // Warteschleife von ca. 203µs, empfohlen sind 125µs
50
    zaehler++;
51
  }
52
            
53
  
54
    ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
55
   while (ADCSRA & (1<<ADSC) ) {}  // auf Abschluss der Konvertierung warten
56
    return ADCW;                    // ADC auslesen und zurückgeben
57
}
58
59
60
int uart_putc(unsigned char c){
61
62
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
63
    {
64
    }                             
65
 
66
    UDR = c;                      /* sende Zeichen */
67
    return 0;
68
}
69
70
void uart_puts (char *s)
71
{
72
    while (*s)
73
    {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
74
        uart_putc(*s);
75
        s++;
76
    }
77
}
78
79
// Timer programmieren, um Wartezeit von 15s zu realisieren
80
void wait (void){
81
  
82
  uint32_t counter;
83
  counter = 0;          // counter zurück setzen
84
  while (counter < 18432000){    // While-Schleife benötigt je Durchlauf 2 Systemtakte
85
  counter++;            // (15s * 3,6864MHz)/2 Systemtakte = 18432000
86
  }
87
}
88
89
int main (void) {
90
    
91
  uint16_t temp;
92
  uint16_t press;
93
  float Temperatur;
94
  float Tiefe;
95
  char s[8]; 
96
97
  uC_init();
98
  adc_init();
99
  usart_init();
100
101
  while(1) { 
102
  
103
  temp = ADC_READ(0);    // Kanal 0 ausgewählt
104
105
  press = ADC_READ(1);   // Kanal 1 ausgewählt
106
107
    temp = temp - 260;    // Offset von 1,27V abziehen (1,27V entsprechen 260 Bit)
108
  press = press - 48;    // Offset von 0,232V abziehen (0,232V entsprechen 48 Bit)
109
  
110
  Tiefe = (press*10)/1023;  // Wert der Tiefe von 0 - 10m berechnen
111
  Temperatur = (temp*25)/1023;// Wert der Temperatur von 0 - 25°C berechnen 
112
113
114
  /*Tiefe übertragen*/
115
116
  while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich                   */
117
    {
118
    }
119
 
120
    UDR = 'D';          // Zeichen "D" für Tiefe (Depth) ausgeben
121
  while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich                   */
122
    {
123
    }
124
 
125
    UDR = ':';          // Doppelpunkt ":" ausgeben
126
    
127
  uart_puts( dtostrf( Tiefe, 7, 3, s ) );    // Tiefe über UART ausgeben
128
  while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich                   */
129
    {
130
    }
131
 
132
    UDR = ';';           // Simikolon ";" ausgeben um Ende kenntlich zu machen 
133
134
135
  /*Temperatur übertragen*/
136
137
  while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich                   */
138
    {
139
    }
140
 
141
    UDR = 'T';          // Zeichen "T" für Temperatur ausgeben
142
  while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich                   */
143
    {
144
    }
145
 
146
    UDR = ':';          // Doppelpunkt ":" ausgeben
147
148
  uart_puts( dtostrf( Temperatur, 7, 3, s ) );// Temperatur über UART auseben
149
  while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich                   */
150
    {
151
    }
152
 
153
    UDR = ';';           // Simikolon ";" ausgeben um Ende kenntlich zu machen
154
  
155
156
  /* Warteschleife von 15s bis zur nächsten Aktualisierung der Daten*/
157
  wait();                 
158
     
159
  }   
160
161
  return 0;
162
163
}

Ich hoffe mir kann jemand helfen...
Danke an alle.

glg, miri

von NopNop (Gast)


Lesenswert?

PSK :-D

von NopNop (Gast)


Lesenswert?

Schon mal ohne max232 probiert was dann an pin 15 anliegt?
Vielleicht  ist der hin.
(hab den code nicht gelesen und die pin belegubg nicht angeschaut)

von Christian P. (pfoertner)


Lesenswert?

Hallo Miri,

wie hast du den max232 beschaltet?
Hast du am Pin15 schon mal ohne max
gemessen?

Gruß

Christian

von Karl H. (kbuchegg)


Lesenswert?

Miriam Weiß schrieb:

> Meine Hardwarebeschaltung an meinem ATMega32 sieht folgendermaßen aus:

Schaltplan wäre besser


> Leider kann ich an PIN15 keine TTL-Pegel messen. Bekomme hier nur ein
> periodisches Signal welches im mV-Bereich liegt. Habe das ganze mal
> oszilloskopiert und als BMP angehängt.

Den MAX abhängen und ein ganz einfaches Primitivprogramm schreiben, 
welches auf dem UART ständig zb 'X' ausgibt. Nicht mehr.

Damit kann man dann anfangen zu messen. Je umfangreicher ein Programm 
ist (von dem du nicht weißt ob es funktioniert), desto mehr 
Fehlerquellen hast du. Und gerade bei der Fehlersuche willst du 
möglichst wenige potentielle Fehlerquellen haben.

von Karl H. (kbuchegg)


Lesenswert?

Hast du eigentlich verifiziert, ob der µC überhaupt läuft?

von dunno.. (Gast)


Lesenswert?

du könntest ja auch mal freie pins an/abschalten, zb einen bei power on, 
einen nach den inits, und dann evtl noch einen in der while() schleife 
toggeln lassen.
- dann einfach mal nen LSA/Multimeter dranhalten, und schauen was 
passiert..

-wenn du schon ein oszi zur verfügung hast, hast du in dem labor nicht 
vielleicht sogar einen jtag adapter...?

mfg

von Miriam W. (miriamw)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Hast du eigentlich verifiziert, ob der µC überhaupt läuft?

Wie macht man das?

Werde auf jeden Fall morgen mal das Programm nach und nach aufbauen und 
immer wieder die zuletzt hinzugefügten Programmteile prüfen.

Das Bild des Oszilloskop ist direkt am PIN15 gemessen.

Die Beschaltung des MAX232 kann ich morgen nachreichen, wobei das 
Problem zur Zeit darin besteht, das an PIN15 noch kein TTL-Pegel messbar 
ist.

Soderle, ich geh schlafen.

Wünsche allen eine gute Nacht.

glg, miri

von Karl H. (kbuchegg)


Lesenswert?

Miriam Weiß schrieb:
> Karl Heinz Buchegger schrieb:
>> Hast du eigentlich verifiziert, ob der µC überhaupt läuft?
>
> Wie macht man das?

zb eine LED blinken lassen.
Was du halt hast und einfach ansteuern kannst und an dem du erkennen 
kannst, ob der µC arbeitet. Je einfacher, desto besser. Am simpelsten 
ist es wohl eine LED blinken zu lassen.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

// Timer programmieren, um Wartezeit von 15s zu realisieren

void wait (void){

  uint32_t counter;
  counter = 0;          // counter zurück setzen
  while (counter < 18432000){    // While-Schleife benötigt je Durchlauf 
2 Systemtakte
  counter++;            // (15s * 3,6864MHz)/2 Systemtakte = 18432000
  }
}



lösch mal deine Kommentarzeile, solcher Code hat nix mit einem "Timer 
programmieren" zu tun ......

von Seri (Gast)


Lesenswert?

Hallo

Wie schon gesagt wurde, ist es am besten einfache Testprogramme mit
möglichst kurzem Code zu schreiben.
Dein Ziel sollte es nun sein irgendein Zeichen über die Rs-232 
Schnittstelle zu senden. Damit du die Grundsätzliche Funktion des 
Bauteiles überprüfen kannst. Danach kannst du diese Funktion dann in 
deinem Main Programm implementieren.

Dieses Vorgehen habe ich immer als sehr hilfreich empfunden.

Viel Erfolg
Seri

von Seri (Gast)


Lesenswert?

Ach ja mein erstes Testprogramm ist auch immer eine LED zu Toggeln. :)

von Miriam W. (miriamw)


Angehängte Dateien:

Lesenswert?

So, hab der Vollständigkeit halber mal aufgezeichnet, wie ich den ATMega 
angeschlossen habe.

Werde das Programm jetzt Stück für Stück aufbauen, wie ihr mir es 
empfohlen habt.

Danke nochmal an alle an dieser Stelle. Auch das muss man erstmal 
lernen, wie man Probleme richtig angeht.

Also, ich mach mich jetzt mal an die Arbeit...

glg, miri

von mr. mo (Gast)


Lesenswert?

auf dem bild sieht man leider nicht viel :X

evtl. die schaltung mal schnell eagln?

von Blackbird (Gast)


Lesenswert?

Reset erhält einen Widerstand von ca. 10k gegen Vcc und einen 
Kondensator von ca. 2,2n - 4,7n gegen Masse.
Ist das ein Quarz (Zweibeiner) oder ein Quarzoszillator (Vierbeiner)?

Blackbird

von Blackbird (Gast)


Lesenswert?

Aref hat den 100n gegen GND, nicht gegen Vcc! Keine Spannung anlegen.

Nur AVcc erhält die (uber L gesiebte) Vcc und hat einen Kondensator 100n 
gegen Masse.

von Blackbird (Gast)


Angehängte Dateien:

Lesenswert?

Hier mal die Beschaltung eines 40beiners.
Wenn Du die LEDs und die Tasten wegläßt (die kompletten Schaltungsteile) 
und statt der 9pol. Sub-D-Buchse das 50 Ohm-Kabel anschließt (nur TxD 
und GND) - dann kann das Deine Beschaltung sein.

Blackbird

von Blackbird (Gast)


Angehängte Dateien:

Lesenswert?

Sorry, hier noch mal als *.png.

Blackbird

von Uwe (Gast)


Lesenswert?

Du mußt Pin 15 Als Ausgang definieren ! Also Datenrichtungsregister mit 
dem Richtigen Wert laden. Habe ich zumindest nirgends bei dir im 
Quelltext gesehen.

von Uwe (Gast)


Lesenswert?

ups, hab gerade gesehen das AVRs beim setzen von TXEN das von alleine 
machen.
Hmmm ...

von Carsten G. (tropby)


Lesenswert?

Hallo,
ich beschalte meistens den ATMega32 wie im Anhang zu sehen. Das 
Funktioniert auch sehr gut. Der Jumper kann natürlich auch weggelassen 
werden.


Hier die Werte der Bauteile:
----------------------------

IC5 = ATMega32 / ATMega644
IC4 = Max232

R12, R13 = 10 kΩ
C12, C13 = 22 pF
L1 = 10 μH
C4, C11 = 100nF
Q2 = 8/16 MHz
C14, C15, C16, C17 = 10 μF

von Miriam W. (miriamw)


Lesenswert?

Leute, ich bin grad richtig happy :)

Habe jetzt als erstes ein kleines Programm geschrieben, in dem ich 
abwechselnd ein PIN auf high und im nächsten Takt auf low gesetzt habe, 
um zu prüfen, ob mein Controller mit dem angeschlossenen Quarz arbeitet 
oder mit dem internen Takt! Siehe da, der Kehrwert ist gleich der 
Frequenz des Quarzes.

Als nächstes habe ich dann mein Programm erweitert und die Zeichen 
'T''E''S''T' hintereinander ausgegeben!
1
#include <avr/io.h>
2
#include <stdint.h>
3
#include <stdlib.h>
4
5
6
7
8
void usart_init (void){
9
     UCSRB |= (1<<TXEN);                            // UART TX einschalten
10
    UCSRC = (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0);   // Asynchron 8N1 
11
    UBRRH = 0x00;          // Wert ergibt sich aus folgender Formel
12
    UBRRL = 0x1F;          // UBRR = (Taktfrequenz/(16*Baudrate))-1=31
13
14
}
15
16
 
17
int main (void) {            // (2)
18
19
  usart_init();
20
21
 
22
   DDRB  = 0xFF;             // (3)
23
   PORTB = 0x03;             // (4)
24
 
25
   while(1) {                // (5a)
26
27
     PORTB = 0x00;
28
29
30
31
 while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich                   */
32
    {
33
    }
34
 
35
    UDR = 'T';
36
  
37
 while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich                   */
38
    {
39
    }
40
 
41
    UDR = 'E';
42
  
43
 while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich                   */
44
    {
45
    }
46
 
47
    UDR = 'S'; 
48
  
49
 while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich                   */
50
    {
51
    }
52
 
53
    UDR = 'T';                           
54
55
56
  PORTB = 0x03;
57
  
58
59
60
     /* "leere" Schleife*/  // (5b)
61
   }                         // (5c)
62
 
63
   /* wird nie erreicht */
64
   return 0;                 // (6)
65
}

Leider gibt mir der Terminalviewer manchmal 4 andere Zeichen aus, ich 
denke man muss noch start-stop-bits einfügen?! Auf jeden Fall sollte es 
ein Softwareproblem sein und der MAX232 ist vermutlich richtig 
angeschlossen?!
Was meint ihr?

Wollte euch auf jeden Fall nach der ganzen Hilfe auf dem laufenden 
halten...

Man, langsam fängts an Spaß zu machen...:)

glg, miri

von Carsten G. (tropby)


Lesenswert?

Ich habe mir den Quellcode mal angesehen. Bei mir läuft er auch soweit 
nachdem ich die uart_init angepasst habe. Ich glaube, dass du die 
Baudrate falsch berechnet hast. Die Stopbits setzt du ja schon:
1
UCSRC = (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ);   // Asynchron 8N1


Hier der Quellcode der bei mir Funktioniert. Du musst nur CPU-Frequenz 
und Baudrate so anpassen wie du es brauchst! Warscheinlich steht F_CPU 
bei dir bereits in dem Makefile. Dann kannst du den Define löschen.
1
#define F_CPU 16000000UL  // Systemtakt in Hz 
2
#define BAUD 9600UL      // Baudrate
3
4
5
#include <avr/io.h>
6
#include <stdint.h>
7
#include <stdlib.h>
8
#include <avr/delay.h>
9
10
 
11
// Berechnungen
12
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
13
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
14
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
15
 
16
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
17
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
18
#endif 
19
20
21
22
void usart_init (void)
23
{
24
  UBRRH = (UBRR_VAL >> 8);
25
  UBRRL = (UBRR_VAL);
26
  UCSRB |= (1<<TXEN);
27
  UCSRC = (1<<7)|(1 << UCSZ1)|(1 << UCSZ0);   // Asynchron 8N1 
28
}
29
30
 
31
int main (void) 
32
{
33
  usart_init();
34
  DDRB  = 0xFF;
35
  PORTB = 0x03;
36
 
37
  // Main Loop
38
  while(1) 
39
  {
40
    PORTB = 0x00;
41
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich                   */
42
    {
43
    }
44
    UDR = 'T';
45
  
46
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich                   */
47
    {
48
    }
49
    UDR = 'E';
50
  
51
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich                   */
52
    {
53
    }
54
    UDR = 'S'; 
55
  
56
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich                   */
57
    {
58
    }
59
    UDR = 'T';
60
                    
61
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich                   */
62
    {
63
    }
64
    UDR = 0x0D;
65
    
66
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich                   */
67
    {
68
    }
69
    UDR = 0x0A;
70
71
    _delay_ms(500);
72
73
    PORTB = 0x03;
74
  }
75
  
76
  return 0;
77
}

Ich würde dir für die Zukunft aber vorschlagen, dass du das senden eines 
Bytes in eine Funktion packst. Sonst ist der Code sehr schlecht zu 
lesen.

von NopNop (Gast)


Lesenswert?

Die Funktion hat sie ja eigentlich schon...nutzt sie aber nicht.
(uart_putc() )

von Carsten G. (tropby)


Angehängte Dateien:

Lesenswert?

Stimmt hatte ich nicht gesehen. Ich hatte mir nur den letzten Quellcode 
raus kopiert und da war die Funktion nicht mit dabei.

Habe das ganze grade mal angepasst bei mir ;-)
Im Anhang ist eine neue Datei (ungetestet). Lässt sich aber kompilieren 
daher denke ich, dass die in Ordnung ist.

von Miriam W. (miriamw)


Lesenswert?

Hey Jungs,

vielen lieben Dank für eure Hilfe. Ich habe mein Programm jetzt 
entsprechend euren Vorgaben verändert und nutze nun die Funktion 
"uart_putc" um die Zeichen auf meine Schnittstelle zu schreiben.

Werde jetzt mal den ADC mit einfügen und versuchen einen Wert zu wandeln 
und diesen dann über die Schnittstelle auszugeben.

Auf jeden Fall nochmal ein großes Dankeschön an alle die mir geholfen 
haben. Echt lieb von euch...

glg, miri

von Miriam W. (miriamw)


Lesenswert?

Hey Jungs,

es läuft alles. Allerdings gibt mir der ADC bei 5V an PA0 nur einen 
gewandelten Wert von 754 aus, obwohl AREF 5V ( =AVCC) gewählt ist.
Außerdem gibt der ADC mir von 0-2V am Eingang ständig 33 aus. Von 3-5V 
ist der Verlauf linear. Ich kann sogar über die 5V hinaus gehen und der 
Wert steigt weiter?!
Kann es sein, dass ich den AD-Wandler beschädigt habe, da ich vorher 
versehentlich extern 5V an AREF angelegt habe?

Mein Code zum ADC sieht folgendermaßen aus:

1
//////////////////////////////////////////////////////////////////////////////////////////
2
// ADC INIT
3
//////////////////////////////////////////////////////////////////////////////////////////
4
void adc_init(void) // ADC initialisieren
5
{
6
  uint16_t result;          // Variable result deklarieren
7
8
  ADMUX = (0<<REFS1) | (1<<REFS0);    // AVcc als Referenz benutzen
9
  ADCSRA = (1<<ADPS2);     // Frequenzvorteiler auf 16 setzten dann  
10
  ADCSRA |= (1<<ADEN);                  // ADC aktivieren
11
  /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
12
     also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
13
14
  ADCSRA |= (1<<ADSC);                // starte eine ADC-Wandlung zur Initialisierung
15
  while (ADCSRA & (1<<ADSC) ) {}      // auf Abschluss der Konvertierung warten
16
  
17
  result = ADCW;
18
19
}
20
21
//////////////////////////////////////////////////////////////////////////////////////////
22
// ADC MESSUNG
23
//////////////////////////////////////////////////////////////////////////////////////////
24
uint16_t ADC_READ( uint8_t channel )
25
{  
26
  uint16_t zaehler;
27
  ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F); // löscht alte Werte in MUX0-MUX4 und schreibt neuen Wert in selbige 
28
  
29
  zaehler = 0;          // Zähler zurück setzen
30
    while (zaehler < 500){      // Warteschleife von ca. 203µs, empfohlen sind 125µs
31
    zaehler++;
32
  }
33
            
34
  
35
    ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
36
     while (ADCSRA & (1<<ADSC) ) {}  // auf Abschluss der Konvertierung warten
37
    return ADCW;                    // ADC auslesen und zurückgeben
38
}

Und wird folgendermaßen aufgerufen:
1
  temp = ADC_READ(0);    // Kanal 0 ausgewählt
2
  press = ADC_READ(1);   // Kanal 1 ausgewählt

Vielleicht weiß jemand Rat und stand selbst schonmal vor dem Problem?

glg, miri

von Patrick (Gast)


Lesenswert?

Hi Miriam,

- Dein Frequenzteiler (durch 16) passt? Hab mir jetzt nicht den ganzen 
Thread durchgelesen, aber im ersten Posting von Dir war er noch 32.

- Deine Warteschleife ist Murks. Binde doch einfach die util/delay.h ein 
und benutze _delay_us.


MfG

Patrick

von AVerr (Gast)


Lesenswert?

Falls du AREF so beschaltet hast, wie bei 
Beitrag "Re: Brauche Hilfe bei Projektarbeit" zu sehen, ist es 
kein Wunder, dass etwas nicht stimmt.

Der 100nF Kondensator muss von AREF nach GND verbunden sein, nicht nach 
AVCC.

von Miriam W. (miriamw)


Lesenswert?

Ja, Frequenzteiler müsste passen. Komme auf eine Frequenz von 150kHz.

das delay werde ich einfügen :) Danke für den Tip...

Kann es denn sein, dass ich den µC zerstört oder beschädigt habe?

Habe hier zwar noch 4 andere ATMega32 rumfliegen, aber die sind 
verfused. Die müsste ich mit dem stk500 erstmal parallel in den 
Ursprungszustand zurücksetzten, weiß aber leider nicht wie das geht...

glg, miri

von NopNop (Gast)


Lesenswert?

>Ich kann sogar über die 5V hinaus gehen
Das solltest Du nicht machen!

>Allerdings gibt mir der ADC bei 5V an PA0 nur einen gewandelten Wert von >754 aus
Wie stellst Du das fest?
Über den UART?
Wie gibst Du den gewandelten Wert aus?
Schon mal versucht einen definierte Variable auszugeben ob das 
funktioniert?

von Miriam W. (miriamw)


Lesenswert?

AVerr schrieb:
> Falls du AREF so beschaltet hast, wie bei
> Beitrag "Re: Brauche Hilfe bei Projektarbeit" zu sehen, ist es
> kein Wunder, dass etwas nicht stimmt.
>
> Der 100nF Kondensator muss von AREF nach GND verbunden sein, nicht nach
> AVCC.

Ja, das hab ich bereits behoben. Meine Frage war jetzt, ob ich durch die 
anfangs falsche Beschaltung etwas zerstört haben kann. Habe jedenfalls 
jetzt das Problem, dass sich von 0-2V nichts tut und der Endwert auch 
nicht bei 7V erreicht ist...hmmm mist!

lg

von Patrick (Gast)


Lesenswert?

Naja, ich sag mal so, sehr viel wahrscheinlicher (anhand Deiner 
Beschreibung der Wandlungsergebnisse) ist, dass der GCC Deine 
Warteschleife rauswirft und der ADC dadurch nicht genug Zeit zum Umladen 
hat ;)

von Miriam W. (miriamw)


Lesenswert?

NopNop schrieb:
>>Ich kann sogar über die 5V hinaus gehen
> Das solltest Du nicht machen!
>
>>Allerdings gibt mir der ADC bei 5V an PA0 nur einen gewandelten Wert von >754 
aus
> Wie stellst Du das fest?
> Über den UART?
> Wie gibst Du den gewandelten Wert aus?
> Schon mal versucht einen definierte Variable auszugeben ob das
> funktioniert?


Ja, bin auch nur minimal über 5V gegangen^^

Der UART funktioniert. Wenn ich einen Wert in die Variable schreibe wird 
dieser Wert auch korrekt gesendet...!

lg

von Miriam W. (miriamw)


Lesenswert?

Also,

habe jetzt mal folgendes probiert:

1.: Frequenzteiler von 16 auf 32 gesetzt --> Keine Verbesserung

2.: Register so ausgelesen:
1
x = ADCL;     
2
x += (ADCH<<8);
anstatt so:
1
x = ADCW;
--> Keine Verbesserung

3.: Externes Vref benutzen:
1
ADMUX = (0<<REFS1) | (0<<REFS0);    //Externes Vref benutzen
--> Keine Verbesserung

4.: Warteschleife durch
1
_delay_ms(30); // Wartezeit
 ersetzt und Wartezeit verlängert.
1
//////////////////////////////////////////////////////////////////////////////////////////
2
// ADC MESSUNG
3
//////////////////////////////////////////////////////////////////////////////////////////
4
uint16_t ADC_READ( uint8_t channel )
5
{  
6
  _delay_ms(30); // Wartezeit
7
  ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F); // löscht alte Werte in MUX0-MUX4 und schreibt neuen Wert in selbige 
8
  _delay_ms(30); // Wartezeit
9
            
10
    ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
11
     while (ADCSRA & (1<<ADSC) ) {}  // auf Abschluss der Konvertierung warten
12
  return ADCW;                    // ADC auslesen und zurückgeben
13
}
--> Keine Verbesserung

Hat sonst keiner mehr eine Idee? Kann jemand eine Aussage treffen, ob 
der µC defekt sein kann, weil ich vorher falsch beschaltet hatte?

glg, miri

von Patrick (Gast)


Lesenswert?

Also, Dein Code sieht korrekt aus.

Hast Du mal andere Analogeingänge ausprobiert?

Ich bin mir jetzt nicht (mehr) 100%ig sicher, aber ich bilde mir ein, 
dass das mal irgendwo stand, dass man den AREF-Eingang beschädigen kann, 
wenn man eine externe Spannung einspeist und z. B. die interne 
Referenzspannung aktiviert.

Daher denke ich, es wäre wohl sinnvoll mal einen anderen AVR 
auszuprobieren.

Ich bilde mir ebenfalls ein, dass das HV-Programmieren mit dem 
AVR-Studio keine große Sache war; konnte man das nicht irgendwo im 
Dialog auswählen? (Ist aber ohne Gewähr; hatte schon lange nichts mehr 
mit AVR-Studio - und AVRs - zu tun)

von Miriam W. (miriamw)


Lesenswert?

Hallo Jungs,

wollte euch nur kurz mitteilen, dass ich das Problem mit dem ADC gelöst 
habe indem ich einen neuen ATMega32 benutzt habe. Scheinbar hat der ADC 
durch die falsche Beschaltung ( externe 5V an AREF, obwohl AVCC als AREF 
eingestellt war) Schaden genommen.

Auf jeden Fall klappt es jetzt. Wenn ich an PA0/1 5V anlege bekomme ich 
einen Wert von 1023.

Außerdem habe ich die Erkenntnis gewonnen, dass ich immer zuerst das 
Programm in den µC brennen muss und erst danach die Fuses. Andernfalls 
kann ich den µC nicht mehr auslesen bzw. nicht mehr programmieren.

Eine Frage habe ich aber noch. Ich gebe meine Werte als float aus, also 
mit 3 Nachkommastellen. Wie kann ich die letzten beiden Nachkommastellen 
abschneiden, um beispielsweise einen Wert wie 18,6 auszugeben?

Danke nochmal an ALLE die mir so geduldig geholfen haben. Bin im 
Nachhinein froh, dass ich das Projekt, obwohl die Note schon fest stand, 
doch noch durchgezogen habe. Habe auf jeden Fall einiges gelernt... :)

glg, miri

von Carsten G. (tropby)


Lesenswert?

Hallo,
ich denke mal du nutzt im moment ftoa. Wenn du wirklich mit Floats 
arbeiten willst kannst du die Formatierung mit sprintf machen. Diese 
Funktion ist jedoch sher Speicher- und Zeitintensiv. Ich für meinen Teil 
arbeite eigenlich fast garnicht mehr mit floats. Ich rechne intern alles 
mit Integern. Meistens ist das kein problem! Bei dem Faktor 10 kann man 
eigendlich gut bei der Ausgabe das komma reinfuschen.

von NopNop (Gast)


Lesenswert?

Miriam Weiß schrieb:
> Außerdem habe ich die Erkenntnis gewonnen, dass ich immer zuerst das
> Programm in den µC brennen muss und erst danach die Fuses.

Eigentlich reicht es wenn man das einmalig macht... :-D

Miriam Weiß schrieb:
> Eine Frage habe ich aber noch. Ich gebe meine Werte als float aus, also
> mit 3 Nachkommastellen. Wie kann ich die letzten beiden Nachkommastellen
> abschneiden, um beispielsweise einen Wert wie 18,6 auszugeben?

Schau Dir mal die Doku zu der Funtion dtostrf() an.

Miriam Weiß schrieb:
> Habe auf jeden Fall einiges gelernt... :)

Ohne es Böse zu meinen...ich würde noch eine Weile weitermachen damit.

Grüße

von Miriam W. (miriamw)


Lesenswert?

NopNop schrieb:
> Miriam Weiß schrieb:
>> Außerdem habe ich die Erkenntnis gewonnen, dass ich immer zuerst das
>> Programm in den µC brennen muss und erst danach die Fuses.
>
> Eigentlich reicht es wenn man das einmalig macht... :-D

Das ist mir schon klar, dass man die Fuses nur einmal schreiben muss. 
Das Programm ändert sich aber gelegentlich ;)
Allerdings ist die Reihenfolge bei der ersten Programmierung wichtig, da 
man andernfalls keinen Zugriff mehr auf den µC hat.

NopNop schrieb:
> Miriam Weiß schrieb:
>> Eine Frage habe ich aber noch. Ich gebe meine Werte als float aus, also
>> mit 3 Nachkommastellen. Wie kann ich die letzten beiden Nachkommastellen
>> abschneiden, um beispielsweise einen Wert wie 18,6 auszugeben?
>
> Schau Dir mal die Doku zu der Funtion dtostrf() an.

Danke für den Tip, hab das Problem behoben :)

NopNop schrieb:
> Miriam Weiß schrieb:
>> Habe auf jeden Fall einiges gelernt... :)
>
> Ohne es Böse zu meinen...ich würde noch eine Weile weitermachen damit.

Hast du vollkommen recht, werde ich machen. Mir macht es jetzt sogar 
Spaß, wenn man sieht das es funktioniert :)

Carsten G. schrieb:
> Hallo,
> ich denke mal du nutzt im moment ftoa. Wenn du wirklich mit Floats
> arbeiten willst kannst du die Formatierung mit sprintf machen. Diese
> Funktion ist jedoch sher Speicher- und Zeitintensiv. Ich für meinen Teil
> arbeite eigenlich fast garnicht mehr mit floats. Ich rechne intern alles
> mit Integern. Meistens ist das kein problem! Bei dem Faktor 10 kann man
> eigendlich gut bei der Ausgabe das komma reinfuschen.

Hab das Problem schon mit der Funktion dtostrf() gelöst.
Danke dir aber auch nochmal ganz herzlich für deine Mühen. Hast mir sehr 
weitergeholfen :)

glg, miri

von Miriam W. (miriamw)


Lesenswert?

Halli Hallo,

soderle, hab mein Projekt soweit fertig. Möchte jetzt nur noch ein 
bisschen Kosmetik machen...

Bisher lese ich meine Daten über einen Terminalviewer aus. Allerdings 
sört mich hier ein bisschen, dass die Daten nicht überschrieben werden, 
sondern untereinander weg geschrieben werden. Ich will aber, dass immer 
nur der aktuelle Wert zu sehen ist.
Hab mir daher zwei Visualisierungsprogramme installiert (LogView und 
XMON), allerdings krieg ich das schon den ganzen Tag nicht auf die 
Kette... :D

Mit welchen Programmen arbeitet ihr um eure Daten zu visualisieren?

glg, miri

von Bernhard B. (schluchti)


Lesenswert?

Ich würde es so machen:
printf("Messwert = %d\r", messwert);

Mit dem \r setzt du dich wieder an den Anfang der Zeile und der zuvor 
ausgegebene Wert wird "überschrieben".

War es das, was du gesucht hast?

von Miriam W. (miriamw)


Lesenswert?

Ja genau,

das ist schonmal super. Aber jetzt hab ich Lust bekommen, das ganze noch 
visuell darzustellen mittels Anzeige oder Balkendiagramm.

Gibts da auch eine Möglichkeit?

glg und vielen Dank...

von Bernhard B. (schluchti)


Lesenswert?

Miriam Weiß schrieb:
> Aber jetzt hab ich Lust bekommen, das ganze noch
> visuell darzustellen mittels Anzeige oder Balkendiagramm.
>
> Gibts da auch eine Möglichkeit?

Ich hab mir jetzt nicht den ganzen Thread durchgelesen, aber vielleicht 
kannst du nochmal kurz erklären, was du genau darstellen möchtest.
Ich nehme an du misst etwas und die Messwerte werden dann per USART an 
den PC übertragen? Und diese Werte möchtest du in einem Histogramm(?) 
darstellen?

von Miriam W. (miriamw)


Lesenswert?

Genau, es werden zwei gemessene Werte per USART an einen MAX232 
übergeben, der dann die Werte in den Rechner speist.
Habe bisher die Werte mittels "uart_putc" auf die Schnittstelle 
geschrieben.

Habe gerade nach Steuerzeichen gesucht, die den Schreibkopf wieder in 
die Anfangsposition fahren und somit den vorangegangene Wert 
überschreiben.
Aber habe nur den Befehl Backspace gefunden, den ich in einer Schleife 
so lange durchführen könnte, bis ich wieder in der Anfangsposition bin.
Aber es gibt doch sicherlich einfachere Wege, oder?

lg

von lfcr (Gast)


Lesenswert?

Miriam Weiß schrieb:
> Habe gerade nach Steuerzeichen gesucht, die den Schreibkopf wieder in
> die Anfangsposition fahren und somit den vorangegangene Wert
> überschreiben.
> Aber habe nur den Befehl Backspace gefunden, den ich in einer Schleife
> so lange durchführen könnte, bis ich wieder in der Anfangsposition bin.
> Aber es gibt doch sicherlich einfachere Wege, oder?
Ohne den Thread gelesen zu haben: Such nach carriage return

von Miriam W. (miriamw)


Lesenswert?

lfcr schrieb:
> Miriam Weiß schrieb:
>> Habe gerade nach Steuerzeichen gesucht, die den Schreibkopf wieder in
>> die Anfangsposition fahren und somit den vorangegangene Wert
>> überschreiben.
>> Aber habe nur den Befehl Backspace gefunden, den ich in einer Schleife
>> so lange durchführen könnte, bis ich wieder in der Anfangsposition bin.
>> Aber es gibt doch sicherlich einfachere Wege, oder?
> Ohne den Thread gelesen zu haben: Such nach carriage return

Carriage return benutze ich bereits in Verbindung mit Line Feed.
Durch die einzelne Verwendung von Carriage Return gehe ich nur an den 
Zeilenanfang der aktuellen Zeile. Ich gebe aber immer zwei Zeilen aus 
und will nicht in der Anfangsposition der zweiten Zeile neu dtarten 
sondern in der ersten Zeile... :)

lg

von lfcr (Gast)


Lesenswert?

OK, ein Steuerzeichen "line up" gibt es meines Wissens nicht.

von Karl H. (kbuchegg)


Lesenswert?

Dann musst du mal suchen, ob deine "Visualisierungstools" (LogView und
XMON) eventuell zum Beispiel die VT-100 Escape Sequenzen verstehen.

Sprich: du musst auf der PC Seite untersuchen, welche Möglichkeiten dir 
deine Werkzeuge bieten, ansprechenden Output zu erzeugen. Und erst dann, 
wenn du das weißt, kannst du deinen µC damit 'beauftragen' diese 
Möglichkeiten auch zu nutzen.

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.