Forum: Mikrocontroller und Digitale Elektronik KTY81/110 Temperatur Messung Programm in C


von Max M. (Firma: Zumtobel) (marimax)


Angehängte Dateien:

Lesenswert?

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
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

> 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
von Christian D. (chris83)


Lesenswert?

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.

von Max M. (Firma: Zumtobel) (marimax)


Angehängte Dateien:

Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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
von Karl H. (kbuchegg)


Lesenswert?

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?

von Max M. (Firma: Zumtobel) (marimax)


Angehängte Dateien:

Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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
von Karl H. (kbuchegg)


Lesenswert?

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.

von Max M. (Firma: Zumtobel) (marimax)


Lesenswert?

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?

von Thomas F. (igel)


Lesenswert?

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"

von Max M. (Firma: Zumtobel) (marimax)


Lesenswert?

Vielen Dank ich werde das mit dem Protokoll versuchen

von Michael B. (laberkopp)


Lesenswert?

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.

von Max M. (Firma: Zumtobel) (marimax)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.