Forum: Mikrocontroller und Digitale Elektronik Deklaration von variablen bei KEIL


von Patrick W. (seennoob)


Lesenswert?

Hallo alle

Ich hab ein Problem beim Deklarieren von Variablen beim Keil µVision2

Ich will eine Variable an einem Port ausgeben aber es will einfach nicht 
funktionieren.
1
#include<89c51rd2.h>
2
#include<stdio.h>
3
4
5
6
int main()
7
{  
8
  unsigned char a,b;
9
  b=2*2;
10
  a=b;
11
12
  P0=a;
13
}

habt ihr vielleicht eine Idee was falsch sein könnte ?

mfg Patrick

von Rooney B. (rooney)


Lesenswert?

Was geht denn nicht? Gibt KEIL bereits beim Kompilieren einen Fehler 
aus?

Schreibst du auf das richtige (Port) Register?
Ist der Port als Output konfiguriert?
Funktioniert es wenn du z.B. PO = 0xAA schreibst?

von Bratensaft (Gast)


Lesenswert?

Vielleicht tuts auch ein return 0; am ende vom main...

Ist bestimmt nicht verkehrt ;-)

von ARM-Fan (Gast)


Lesenswert?

>Vielleicht tuts auch ein return 0; am ende vom main...

???

vielleicht eher ein "while(1);" !

P0 hat keine (oder nur schwache?) Pullups.
Hast du da externe Pullups dran hängen?
Wenn nicht, dann hol das mal nach oder mach deinen Versuch
an einem anderen Port.

von ARM-Fan (Gast)


Lesenswert?

>Ist der Port als Output konfiguriert?

Gibts beim 8051er nicht.

von R. W. (quakeman)


Lesenswert?

ARM-Fan wrote:
> Gibts beim 8051er nicht.

Das stimmt so nicht (mehr). Nur bei den ursprünglichen 8051er gibts das 
nicht, aber jeder aktuelle 8051 kompatible Controller besitzt diverse 
Betriebsmodes für die Portpins. Z.B. Bei den LPC900 sind diese nach dem 
Reset standardmäßig auf input-only gesetzt.

@Patrick Weinberger
Du müsstest also für den 89c51rd2 erst mal überprüfen, ob die Pis 
richtig konfiguriert sind nach dem Reset, oder ob du dies erst noch 
machen musst.

Ebenfalls solltest du dein Main Programm auch mit "void Main()" 
definieren und nicht mit "int". Denn normalerweise ist der Main Teil der 
oberste Zweig und kann deshalb nichts zurückliefern.

Ciao,
     Rainer

von Patrick W. (seennoob)


Lesenswert?

@ Rainer

Der 80c51ed2/rd2 ist so ein uralt Version ohne Betriebsmodis und leider 
auch keine ADC usw.


@ Arm-Fan

Wenn ich zB sage P0=0; leuchten meine LED's also an dem PULL-UP wirds 
wohl eher nicht liegen.

Was ich glaub das ihm die Deklaration nicht ganz passt dem µC. KEIL gibt 
beim compilieren

Build target 'Target 1'
linking...
Program Size: data=11.0 xdata=0 code=30
creating hex file from "Beispiel"...
"Beispiel" - 0 Error(s), 0 Warning(s).

aus also würd sagen es passt alles außer ihr könnt da was anderes raus 
lesen und das Übertragen mit FLIP 3.3.1 funktioniert auch problemlos. 
Also würd ich sagen die Deklaration mag er nicht .

schon mal Danke an alle µC Spezialisten hier für die Lösungsvoeschläge

von ??? (Gast)


Lesenswert?

Und mal im Debug ausprobiert? Wird da dein Port geschalten? Kannst du 
statisch direkt den Port mit Werten belegen?

von Patrick W. (seennoob)


Lesenswert?

ganz ein anderes Problem hab mich mit dem Port geirrt es ist P1 und 
nicht P0
Ich könnt mir deswegen echt in den Arsch beißen aber trotzdem danke

von ARM-Fan (Gast)


Lesenswert?

Guten Appetit ;-)

von Patrick W. (seennoob)


Lesenswert?

Jetzt hätt ich noch ne Frage wie behandelt man im C Interrupts ?
zB Timmer
Ich werd aus dem Internet irgendwie nicht schlau

von R. W. (quakeman)


Lesenswert?

Hier ein ganz einfaches Beispielprogramm, welches in eine 
Interruptroutine (ISR) springt bei einer negativen Flanke an INT1. Das 
Beispiel ist für uVision mit C51 Compiler erstellt worden.
Die ISR wird durch den Begriff "(void) interrupt 2" definiert, wobei die 
"2" für den jeweiligen Interrupt steht.


#include    <reg517a.h>

unsigned char wert = 0;

main() {
  EX1 = 1;  // Ext Int1 freigeben
  IT1 = 1;  // Ext Int1 flankengetriggert (negative-Flanke)
  EAL = 1;  // Interrupts generell freigeben

  while(1) {
    P1 = 0;
    if(wert == 1) {
      wert = 0;
      P1 = 1;
    }
  }
}

void fallende_flanke (void) interrupt 2 {
  wert = 1;
}

von Patrick W. (seennoob)


Lesenswert?

Also Interrupt und die Nummer vom Interrupt die im Datenblatt steht also 
?

Ich frag mich grad warum ich nur so viel Zeit mit Assembler verschwendet 
hab. Soll sich der Compiler mit dem Maschinencode beshäftigen ;-) Naja 
mein Professor hat es sich eingebildet.

Danke Rainer

von R. W. (quakeman)


Lesenswert?

In der c51.chm Hilfedatei sind die Interruptvektoren aufgelistet. Dort 
findest du auch weitere Beispiele dafür.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Anzumerken wäre noch, daß Interrupts nicht zum C-Sprachstandard gehören 
und daß jeder Compilerbauer einen zu allen anderen völlig inkompatiblen 
Weg gewählt hat, Interrupts zu implementieren.

Will meinen:
Das Beispiel von "Fox Mulder" ist nur und ausschließlich für Keil-C.

von Maxx (Gast)


Lesenswert?

> Das Beispiel von "Fox Mulder" ist nur und ausschließlich für Keil-C.

Diese Interruptsyntax passt auch so für SDCC.

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.