Forum: Mikrocontroller und Digitale Elektronik probleme mit seriellem interrupt


von humer (Gast)


Lesenswert?

hallo!,

also ich bin gerade dabei für die schule ein projekt zu machen und zwar 
arbeite ich mit Keil microvision 3 und einem humerboard 
(http://www.humerboard.at/) und programmiere in der Sprache c.

rauskommen soll bei dem ganzen eine wetterstation. am demoboard wird 
temperatur, luftdruck usw. eingelesen und dann alle 10sec über eine 
serielle schnittstelle an einen PC gesendet und dort in einem java 
programm gespeichert. mit diesem java programm wird auch die messung 
gestartet indem der Buchstabe 'T' über die serielle schnittstelle an das 
demoboard gesendet wird und im c programm wird ein serieller interrupt 
ausgelöst. und genau da liegt das problem aus irgendeinem grund 
funktioniert das nicht.

daher meine frage was muss beim seriellen interrupt alles initialisiert 
werden an special funktuion registern? und hat der interrupt eine 
spezielle nummer?

mein derzeitiger code:
1
void SerISR(void) interrupt 16
2
{
3
4
  recflag=1;
5
6
   if(S1CON==0x01)
7
    {
8
       c=S1BUF;
9
       S1CON&=0xFE;
10
    }
11
}

würde mich sehr freuen wenn mir jemand weiterhelfen kann.

mit freundlich grüßen,
humer

von Peter D. (peda)


Lesenswert?

Tja, was erwartest Du mit sonem lieblos dahingeworfenen Codeschnipsel 
ohne Kommentare?
Du mußt schon sagen, was Du Dir dabei gedacht hast.

Hast Du überhaupt mal im Datenblatt/Manual den Abschnitt UART gelesen?

Aber zuerst mal, hellsehen kann hier niemand.
Was für nen MC (genaue Bezeichnung) verwendest Du?


Tip:
Meistens will man in nem Register nur ein Bit prüfen, dann geht es 
schief, wenn man das ganze Byte testet.
Oftmals gibts deshalb sogar Bitvariablen (Deine Compiler-Manual gibt 
darüber Auskunft).


Peter

von Humer (Gast)


Lesenswert?

Warum nicht die einfache Funktion printf() verwenden?
#include <reg?????>
#include <stdio.h>
..
...
idata float temperatur;
idata int luftdruck;

main()
{ // Hier die Baudrate einstellen lt. Datenblatt
  while(1)
  {

   printf("T %5.2f %4d ... \n",temperatur,luftdruck);



  }

}
// natürlich müssen die Sensordaten erst ermittelt werden.
// sehen Sie auch unter humerboard.at - Anwendungen nach..

von humer (Gast)


Lesenswert?

danke für die antworten!

inzwischen lauft auch schon alles prima. sensorik, interrupts, 
übertragung von und zum pc usw.

allerdings ein problem hab ich noch und zwar wird derzeit die 
displayanzeige
über einen timer akutalisiert (100ms) und daher blinkt das ganze. wie 
kann ich das machen das es nicht blink aber dafür flüssig die messwerte 
aktualisiert werden?

vl. noch ein paar infos zum system: humerboard mit infineon SAB 80c517a 
und ein 20x2 lcd display.

mit freundlichen grüßen

von Falk B. (falk)


Lesenswert?

@ humer (Gast)

>über einen timer akutalisiert (100ms) und daher blinkt das ganze.

Wahrscheinlich löschst du erst das LCD komplett und schreibst es dann 
neu. Lass das Löschen weg und überschreib es nur neu.

MFG
Falk

von humer (Gast)


Lesenswert?

danke, funktioniert jetzt einwandfrei.

allerdings ist noch ein anderes problem aufgetreten und zwar beim senden 
des Strings an den PC stimmen plötzlich die 2 letzten messwerte nicht 
mehr, obwohl sie am display richtig angezeigt werden.
1
float temp2, wind, druck, feucht;
2
xdata unsigned char ausgabe[25];
3
4
sprintf(ausgabe,"%3.2f#%3.2f#%3.2f#%3d", temp2, wind, druck, feucht);
5
              
6
sendString(ausgabe);

statt diesem String z.B 24,66#5,50#1,01#78 kommt dann sowas wie: 
24,66#5,50#-0,5#11480 am pc an.
interessant ist das immer nur die letzten beiden messwerte flasch sind, 
also wenn ich die reihenfolge vertausche passt der Wert der vorher 
Falsch war, dafür der andere der Richtig war nimmer. Hab zuerst gedacht 
das Feld ist zu klein aber auch mit einem größeren Feld kommt der selbe 
mist raus. hat vl. irgendwer eine ahnung woran das liegen könnte?

vielen dank grüße,
humer

von Falk B. (falk)


Lesenswert?

Stackprobleme? Wieviel SRAM ist in dem Projekt noch frei?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

1
float temp2, wind, druck, feucht;
2
xdata unsigned char ausgabe[25];
3
4
sprintf(ausgabe,"%3.2f#%3.2f#%3.2f#%3d", temp2, wind, druck, feucht);

Das vierte Argument von sprintf ist vom Typ float, sprintf erwartet aber 
einen int, weil Du es mit %3d dazu instruierst. Wenn Du float ohne 
Nachkommastellen ausgeben willst, musst Du %3.0f als Formatstring 
verwenden.

von humer (Gast)


Lesenswert?

ui, sorry. da hab mich wohl beim kopieren etwas vertan. feucht ist 
natürlich als integer deklariert.

@ falk brunner: auf gefahr hin mich zu blamieren, wo kann ich das nach 
sehen wie viel SRAM noch verfügbar ist (Keil Microvision 3.0)?

von Falk B. (falk)


Lesenswert?

@humer (Gast)

>@ falk brunner: auf gefahr hin mich zu blamieren, wo kann ich das nach
>sehen wie viel SRAM noch verfügbar ist (Keil Microvision 3.0)?

Keine Ahnung, ich arbeite nur mit dem WINAVR.

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.