Bitweise Operatoren ABC Ausgabe

banshing

Lt. Junior Grade
Registriert
Aug. 2013
Beiträge
446
Hallo,

lerne gerade mit der Programmiersprache C wie man Microcontroller programmiert.

Jetzt sollten wir über eine serielle Schnittstelle 1x den Buchstaben A ausgeben, der dann im Simulator angezeigt wird.
Das Programm:
Code:
void main()
{
	inituart(250);
	while(true)
	{
		if((Scon&2)==2)
		{
			Sbuf=65;
			Scon=Scon&~2;
		}	
        }
}
Das funktioniert, jetzt sollten wir mit Hilfe einer For-Schleife 1x das gesamte ABC ausgeben lassen, da habe ich mir das gedacht:
Code:
#include <serial_IO.h>
	
__sfr __at 0x98 Scon;
__sfr __at 0x99 Sbuf;

// Hauptprogramm
void main()
{
	inituart(250);
	while(true)
	{
		if((Scon&2)==2)
		{
			for(Sbuf=65;Sbuf<=90;Sbuf=Sbuf+1)
			{
				
			}
			Scon=Scon&(~2);
		
		}
	}
		
				
		
}

Das funktioniert leider nicht :( Mir werden damit durchgehen "@" ausgeschmissen, keine Ahnung wieso.

Kann mir jemand Helfen?
 
Zuletzt bearbeitet:
Das ganze klingt nach einer Hausaufgabe/Schulaufgabe. Demnach gibt es nur einen Gedankenanstoß:

Schreib dir mal schriftlich auf, was dein Programm in den Zeilen 12, 14 und 18 macht.
 
könnte es sein das die Variable nach der Schleife wieder gelöscht wird?
versuch mal ne extra Zähl Variable und das erhöhen von Sbuf in der for Schleife

oder das if in die for schleife? bzw das ganze while?

kenne mich damit speziell nicht aus
 
Zuletzt bearbeitet:
Die Zeile 12 fragt das Bit 1 (Stellenwert 2) ab ob es den Zustand 1 hat (2 als Stellenwert ist Bit 1), wenn es 1 als Zustand hat, also das Senderegister Sbuf leer ist, kann es mit einem Byte beschrieben werden und das innere der IF-Schleife wird ausgeführt.
Die Zeile 14 die Zählschleife soll ab dem Wert 65 (A) bis 90 (Z) jeweile um eins nach oben Zählen. Hier bin ich mir eben nicht mit Sbuf sicher, habe es auch schon mit einer Zählvariablen (X) versucht, die ich am Anfang mit int x eingefügt habe, dann meckert aber der Compiler das void Main inkorrekt ist, total komisch.
Die Zeile 18 ist dafür da um das Bit wieder zu löschen um es neubeschreibbar zu machen.

Kann das der Fehler sein? Das ich quasi Abfrage ob es 1 (beschreibbar) ist, dann muss ich es mit A beschreiben, löschen, abfragen, mit b beschreiben, löschen... bis Z?

EDIT:
Code:
void main()
{
	inituart(250);
	while(true)
	{
		if((Scon&2)==2)
		{
			
			Sbuf=65;
			Scon=Scon&(~2);
			Sbuf=66;
			Scon=Scon&(~2);
			
										
		}
	}
Hiermit schaffe ich es "AB" auszugeben, dass heisst ich könnte manuell die Aufgabe lösen, aber wie mache ich das jetzt eleganter mit einer for-schleife, dass er zählt, löscht, zählt?
 
Zuletzt bearbeitet:
Ich meinte eher, dass du dir aufschreibst, welche Funktion diese Zeilen haben, nicht was sie als Code machen. In Zeile 12 hast du es ja richtig gemacht.

Zeile 12 prüft ob du Senden darfst. (Soweit ich das verstanden habe).
Zeile 14 zählt Sbuf hoch, bis es größer 90 ist.
Zeile 18 sendet das Zeichen, welches in Sbuf steht.

und dieser Ablauf wird halt ständig ausgeführt. Als Tipp guck einmal in einer ASCII-Tabelle welchen Wert das @-Zeichen hat und überlege warum dir das @ übertragen wird.

Kann das der Fehler sein? Das ich quasi Abfrage ob es 1 (beschreibbar) ist, dann muss ich es mit A beschreiben, löschen, abfragen, mit b beschreiben, löschen... bis Z?

Ansich hast du es richtig erkannt. Durch meinen vorhergehenden Text, kannst du dann wahrscheinlich auch erkennen warum man es so machen muss. Dieser AHA-Effekt ist immer wichtig beim Lernen.

In deinem Edit ist der Ablauf wohl richtig, nur hast du das Abfragen dazwischen "vergessen".

EDIT:

Hier bin ich mir eben nicht mit Sbuf sicher, habe es auch schon mit einer Zählvariablen (X) versucht, die ich am Anfang mit int x eingefügt habe, dann meckert aber der Compiler das void Main inkorrekt ist, total komisch.

Das ist auch der "bessere" Weg. Wahrscheinlich ist "int" nicht der richtige Typ.
 
Du hattest es schon fast richtig.

"if((Scon&2)==2)" prüft ob das vorherige Byte gesendet wurde, es muss vom Programm wieder auf 0 gesetzt werden, nach jedem übertragenen Byte. Das löschen des Bits stößt die Übertragung des nächsten Byte in Sbuf an.

So sollte es klappen:
Code:
#include <serial_IO.h>
	
__sfr __at 0x98 Scon;
__sfr __at 0x99 Sbuf;

// Hauptprogramm
void main()
{
	inituart(250);
	while(true)
	{
		for(Sbuf=65;Sbuf<=90;Sbuf=Sbuf+1)
		{
			while((Scon&2)!=2)
			{
				// Eine Art "Sleep" wäre hier gut, aber nicht zwingend nötig
			}
			Scon=Scon&(~2);
		}
	}
}
 
Zurück
Oben