www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Deklaration von variablen bei KEIL


Autor: Patrick Weinberger (seennoob)
Datum:

Bewertung
0 lesenswert
nicht 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.
#include<89c51rd2.h>
#include<stdio.h>



int main()
{  
  unsigned char a,b;
  b=2*2;
  a=b;

  P0=a;
}

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

mfg Patrick

Autor: Rooney Bob (rooney)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Bratensaft (Gast)
Datum:

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

Ist bestimmt nicht verkehrt ;-)

Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ist der Port als Output konfiguriert?

Gibts beim 8051er nicht.

Autor: R. W. (quakeman)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Patrick Weinberger (seennoob)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ??? (Gast)
Datum:

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

Autor: Patrick Weinberger (seennoob)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Appetit ;-)

Autor: Patrick Weinberger (seennoob)
Datum:

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

Autor: R. W. (quakeman)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Patrick Weinberger (seennoob)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: R. W. (quakeman)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Maxx (Gast)
Datum:

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

Diese Interruptsyntax passt auch so für SDCC.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.