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
voiduC_init(void){
5
6
DDRA=0x00;
7
8
}
9
10
11
voidadc_init(void){// ADC initialisieren
12
13
uint16_tresult;// Variable result deklarieren
14
15
ADMUX=(0<<REFS1)|(1<<REFS0);// AVcc als Referenz benutzen
/* 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_tADC_READ(uint8_tchannel){
31
32
uint16_tzaehler;
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
returnADCW;// ADC auslesen und zurückgeben
45
}
46
47
48
49
intmain(void){
50
51
uint16_ttemp;
52
uint16_tpress;
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
return0;
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
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.
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
>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.
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)
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
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.
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.
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.
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
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
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
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
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!
@Rumpelstilzchen (Gast),
es soll bis 08.04. fertig sein, getestet und laufen. Fehlererkennung
kann man immer noch als Update später reinbrennen.
Blackbird
@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.
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
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
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
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
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
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
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
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
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
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
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.
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?
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 !!!
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
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
@ 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)
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
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
@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
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
voiduC_init(void){
7
8
DDRA=0x00;
9
10
}
11
12
13
voidadc_init(void){// ADC initialisieren
14
15
uint16_tresult;// Variable result deklarieren
16
17
ADMUX=(0<<REFS1)|(1<<REFS0);// AVcc als Referenz benutzen
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.
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
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
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.
// 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 ......
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
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
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
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.
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
Du mußt Pin 15 Als Ausgang definieren ! Also Datenrichtungsregister mit
dem Richtigen Wert laden. Habe ich zumindest nirgends bei dir im
Quelltext gesehen.
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
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!
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
return0;// (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
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:
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.
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.
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
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:
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
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, 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
>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?
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
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 ;)
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
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
returnADCW;// 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
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)
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
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.
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
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
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
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?
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...
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?
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
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
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
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.