Hallo, ich bin momentan an einem kleinen Projekt dran. Es geht um eine Temperaturmessung mit dem KTY81/110. Ich habe als Anhang ein Screenshot von unserem Programm und dem Schaltplan gemacht. So nun zu meiner Frage und zwar wollte ich wissen wieso ich das Lcd nicht beschreiben kann mit meinem Programm. Sobald ich einen kurzen Test mache und ein paar Buchstaben anstatt der Temperatur schicke funktioniert alles. Kann mir eventuell einer von euch einen Tipp geben oder eine Lösung? Mit freundlichen Grüßen Max M.
:
Verschoben durch User
Max M. schrieb: > Ich habe als Anhang ein Screenshot von unserem Programm Warum nur? Was ist so schwierig daran, das als Text zu kopieren und zu posten?
> Max M. schrieb: >> Ich habe als Anhang ein Screenshot von unserem Programm > > Warum nur? Was ist so schwierig daran, das als Text zu kopieren und zu > posten? Exakt. Ich seh zwar einige Probleme im Code, unter anderem auch das für dein Problem verantwortliche, aber ich bin zu faul da jetzt mit 3 Fenstern zu arbeiten um den Code abzutippen. Häng dein C File ganz einfach als Attachment an und gut ists. Dann kann sich jeder mit Copy&Paste die relevanten Stellen raukopieren und dir gezielt helfen. So bleibt mir nur: sieh dir die Zeile an, in der du das ADSC Bit setzen solltest. Du tust das nicht. Da wird kein Bit in ADCSRA gesetzt. Und die Zeile in der du ADMUX besetzt ist auch fehlerhaft. Hat allerdings zum Glück für dich keine Auswirkungen. Im übrigen schmeisst du da ja mächtig mit float und dtostrf um dich.
:
Bearbeitet durch User
Was hat das für einen Sinn, dass du auf das Ende der Wandlung wartest aber gleichzeitig den Wert ausliest? Ich denke dass sollte in die nächste Zeile.
Hallo, sorry ist mein 2 Post bin nicht grad der Profi, hab das File mal drangehängt. Ich Starte die Wandlung ja direkt vor der Schleife oder ist das nicht möglich? Hab mittlerweile auch eine Anzeige bekommen jedoch verändert diese sich nicht.
Max M. schrieb: > Hallo, > > sorry ist mein 2 Post bin nicht grad der Profi, hab das File mal > drangehängt. > > Ich Starte die Wandlung ja direkt vor der Schleife oder ist das nicht > möglich? So
1 | // Wandlung starten
|
2 | ADCSRA |= (1<<ADSC); |
3 | |
4 | // warten bis fertig
|
5 | while ( ADCSRA & (1<<ADSC) ) |
6 | {
|
7 | }
|
8 | |
9 | // ergebnis abholen
|
10 | value = (ADCW +1) * (vcc / 1024); |
Du holst dir dein Auto ja auch erst dann aus der Werkstatt wieder ab, wenn es fertig ist und pfuscht nicht rum, während der Mechaniker an der Arbeit ist. und ehe du jetzt wie ein wilder rumrechnest um dann ein falsches Ergebnis zu erhalten: es ist nicht verboten erst mal damit anzufangen, ganz einfach den ADC Wert auszugeben und dann die Berechnung sukzessive Schritt für Schritt einzubauen und sich anzusehen ob die Zwischenergebnisse stimmen.
:
Bearbeitet durch User
Karl H. schrieb: > und ehe du jetzt wie ein wilder rumrechnest um dann ein falsches > Ergebnis zu erhalten: es ist nicht verboten erst mal damit anzufangen, > ganz einfach den ADC Wert auszugeben und dann die Berechnung sukzessive > Schritt für Schritt einzubauen und sich anzusehen ob die > Zwischenergebnisse stimmen. Es ist nichts anrüchtiges dabei, erst mal damit anzufangen
1 | void temp_Messung () |
2 | {
|
3 | char buffer1 [20]; |
4 | |
5 | ADMUX |= 1<<REFS1 | 1<<REFS0 | 0<<ADLAR | 0<<MUX4 | 0<<MUX3 | 0<<MUX2 | 0<<MUX1 | 0<<MUX0; |
6 | ADCSRA |= 1<<ADEN | 0<<ADATE | 0<<ADIF | 0<<ADIE | 1<<ADPS2| 1<<ADPS1| 0<<ADPS0; |
7 | |
8 | ADCSRA |= (1<<ADSC); |
9 | while ( ADCSRA & (1<<ADSC) ) |
10 | {
|
11 | }
|
12 | |
13 | lcd_setcursor( 0, 1 ); |
14 | dtostrf( ADCW, 8, 1, buffer1); |
15 | lcd_string(buffer1); |
16 | }
|
dem KTY ein Feuerzeug unterzuhalten und nachzusehen ob sich die Werte überhaupt verändern, bzw. welche Werte vom ADC kommen. Du hast die interne Referenzspannung eingestellt. Willst du das?
Sorry hatte den Post völlig vergessen hab das Programm nochmal überarbeitet. Temperaturmessung läuft jetzt ohne Probleme, nur ich kann die Daten nicht per Bluetooth übertragen. Benutze das Btm 222. Hab 2 Module eines im Mastermode und eines im Slavemode. Mein Atmega 32 misst die Temperatur und wandelt sie, dann schick der Master die Daten zum Slave. Der 2 Atmega 32 gibt diese dann auf ein Lcd aus. Bekomme nur folgende Zahl übermittelt 0.00 bräuchte dringest Hilfe, kenn mich mit den Return und Wertübergabe Funktionen nich gut aus. Hab mir viele Tutorials durchgelesen bin aber nicht wirklich schlau daraus geworden.
1 | int main(void) |
2 | {
|
3 | |
4 | |
5 | USART_Init(); // Initialise USART |
6 | |
7 | while (1) |
8 | {
|
9 | temp_messung(); |
10 | //u8Data = USART_SendByte;
|
11 | USART_SendByte(UDR); |
na ja. Es wird wahrscheinlich hilfreich sein, wenn man den errechneten Wert verschickt und nicht einfach nur den Inhalt des UDR Registers.
Im übrigen, wenn ich mir dann auch noch den Slave Code ansehe. Dir ist aber schon klar, dass ein float aus mehr als nur einem Byte besteht. Oder? Wenn du dir mit dem ganzen Zeugs unsicher bist, dann verschick doch die Dinge nicht binär. Lass dir einen String erzeugen und verschick diesen. Ist auch mit der ganzen Synchronisierung viel einfacher. Wenn der Master ein
1 | 23.5<Return> |
verchickt, dann kannst du zum Testen erst mal ein ganz normaler Terminalprogramm verwenden, auf dem die Werte lesbar auftauchen. Da kannst du dann testen. Ist soweit alles in Ordnung, dann beschäftigst du dich damit, wie man auf dem Slave eine komplette Zeile aus den eingehenden Bytes (=Charactern) wieder zusammensetzt. Auch da gibt es im Forum genügend Vorlagen. Und dann musst du noch deinen String in eine tatsächliche Zahl konvertieren, wenn du im Slave damit weiterrechnen willst. Das vermeidet erst mal alle Protokoll-Probleme, die du beim versenden von mehreren Bytes automatisch kriegst, weil du bei einem Bytestrom erstmal nicht automatisch weisst, welche 4 aufeinanderfolgenden Bytes eigentlich zusammen gehören und den float bilden. In Textform ist das alles viel einfacher, weil du durch den <Return> automatisch einen Trenner hast, der dir mitteilt, dass hier eine Zeile (und damit auch die Zahl) zu Ende ist und mit dem nächsten Byte eine neue Zeile (und damit eine neue Zahl) beginnt. Gerade Anfänger denken oft, dass binäre Übertragung einfacher wäre, weil sie sich vor der Konvertierung in/vom ein Textformat fürchten. Das genau Gegenteil ist der Fall. Textuelle Übertragung hat einige Vorteile, die einem das Leben leichter machen. Auch Profis benutzen sie gerne, wenn es keine Geschwindigkeitslimitierungen gibt, die das etwas geschwätzigere Textformat aus dem Rennen werfen.
:
Bearbeitet durch User
Karl H. schrieb: >
1 | > int main(void) |
2 | > { |
3 | >
|
4 | >
|
5 | > USART_Init(); // Initialise USART |
6 | >
|
7 | > while (1) |
8 | > { |
9 | > temp_messung(); |
10 | > //u8Data = USART_SendByte; |
11 | > USART_SendByte(UDR); |
12 | >
|
> > na ja. Es wird wahrscheinlich hilfreich sein, wenn man den errechneten > Wert verschickt und nicht einfach nur den Inhalt des UDR Registers. Entschuldigung. Da hatte ich das
1 | void USART_SendByte(uint8_t u8Data) |
2 | {
|
3 | while (!(UCSRA & (1<<UDRE))) /* warten bis Senden moeglich */ |
4 | {
|
5 | }
|
6 | |
7 | UDR = temperatur; |
8 | |
9 | }
|
noch nicht gesehen. Du probierst aber auch wirklich völlig unkonventionell und unsystematisch einfach nur herum.
So ich hab nun fast fertig was ich noch wissen wollte: Ich Messe 1mal die Temperatur und 1mal den Luxwert, dann schick ich sie per USART vom Atmega32 zum BTM222 -> über Bluetooth zum anderen BTM222 dann an den zweiten Atmega32. Kann ich diese 2 Werte irgentwie auseinanderhalten?
Max M. schrieb: > Kann ich diese 2 Werte irgentwie auseinanderhalten? Beitrag "eigenes Protokoll entwickeln" Du kannst natürlich auch bei anderen abschauen: Beitrag "Projekt: Virtuelle Instrumente an serielle Schnittstelle"
Vielen Dank ich werde das mit dem Protokoll versuchen
Max M. schrieb: > So nun zu meiner Frage > und zwar wollte ich wissen wieso ich das Lcd nicht beschreiben kann mit > meinem Programm. Wahrscheinlich weil keins angeschlossen ist, jedenfalls ist im Schaltplan keins zu finden.
Ich hab ein bisschen rumprobiert, jedoch ein brauchbares Ergebnis bekommen. Hab mal alles wieder so geschrieben wie ich es hatte. Hat einer von euch eventuell einen Tipp. Hab C nur in der Schule gelernt und wir haben da relativ simples Zeug gemacht bin also nicht grad der Profi, will mich aber verbessern. Ein Lcd ist angeschlossen :P Ich hab beim Code die Luxübertragung deaktiviert da immer Fehler aufgetreten sind aber es geht immer noch um die Übertragung von 2 Werten. Beide Werte werden immer aufs Lcd ausgeben und zwar beid er Temperatur und bei der Licht anzeige. Gruß Max
:
Bearbeitet durch User
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.