mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Warum funktioniert dieses programm nicht


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <p18f1320.h>
#pragma config OSC = HS             //32MHZ
#pragma config PWRT = ON            //Power Up Timer
#pragma config WDT = OFF            //Watchdog Timer

volatile unsigned char marke=0;



void main(void)
{
 ADCON1 = 0x7f;
 TRISB=0b11110000;
 TRISA=0b11111;
 LATB=0x00;

 while(1){
    if(PORTAbits.RA0) marke=1; else marke=0;
    if(marke) LATB++;
}
}
ich dachte, wenn ich an porta bit 0 eine H anlege, dann muss an dem port 
B der wert hochgezählt werden, also vom 0 bis 255, aber alle leds sind 
auf low. ist das programm falsch???

Autor: Kai Franke (kai-) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kleiner Tipp fürs nächste Mal:
wenn du den verwendeten Controller in den Threadtitel schreibst, muss 
nicht jeder draufklicken. Ich kenne mich mit diesem µC nämlich zB gar 
nicht aus

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TRISA=0b11111;
das sieht nicht gut aus, mach mal
TRISA=0b00011111;
draus, damits ein 8bit-Wert wird.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok probiere gleich aus danke

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein, leider hat nicht geholfen, das selbe ergebnis

Autor: Christian H. (netzwanze) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bist Du sicher, dass Du bei 32MHz noch ein Hochzählen beobachten kannst?

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
na ja habe schon 4MHZ eingebaut, aber portb ausgänge sind "visuell" auf 
low, habe momentan nichts zum messen, wenn es funktionieren würde dann 
müssen die "visuell" auf H sein oder?

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
könnte es sein, dass die if anweisung falsch ist?

Autor: hallo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
42

Autor: Rene K. (draconix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Selbst bei 4Mhz... Das sind immerhin 4.000.000 Anweisungen pro sekunden, 
da kann man ganz leicht mal 256 übersehen ;) Mach in deine While 
Anweisung ein definiertes warten rein und schau ob es dann klappt.

Gehe ich richtig in der Annahme das es sich um einen PIC handelt?!

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja das ist pic18f1320 und ent. umgebung ist mplab c18

Autor: Edi R. (edi_r)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kenne den c18 nicht. Ist "LATB" wirklich Port B, sowohl als Eingang 
als auch als Ausgang?

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so wie ich es verstanden habe, LATB ist ausgang, PORTB ist eingang, mehr 
kann ich auch nicht dazu sagen ;)

Autor: Edi R. (edi_r)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei "LATB++" wird erst aus LATB gelesen, dann um eins erhöht, dann auf 
LATB zurückgeschrieben. Wenn LATB nicht der Eingang von Port B ist, wird 
irgendwas anderes inkrementiert und auf dem Port ausgegeben.

Probier's mal mit "LATB = PORTB+1" statt "LATB++".

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein geht nicht, habe probiert, der reagiert nicht auf dise anweisung 
if(marke) nicht, aber warum, die variable ist doch global definiert???

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
diese anweisung arbeitet nicht: if(PORTAbits.RA0) marke=1; else 
marke=0;, der setzt die variable marke nicht auf 1; aber warum???

Autor: Michael Leusink (hasimaus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Thomas,

zuerst mal: Ich kenn' den PIC auch nicht.

Aber, bei Dir scheinen beide "IF" Abfragen nicht richtig zu 
funktionieren. Nicht alle Kompiler verstehen "<>0" als "TRUE" und "0" 
als "FALSE". Somit wird die "IF" Abfrage auf "0" nicht unbedingt korrekt 
verarbeitet.

Versuch's mal mit "if(PORTAbits.RA0 == 1)".
Zudem scheint mir die Einführung der Variable "marke" redundant, da Du 
ja gleich

if(PORTAbits.RA0 == 1) LATB++;

machen kannst.

Gruß

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für den vorschlag, habe gerade ausprobiert, leider das gleiche 
ergebnis, die variable "marke" ist in dem fall redundant, gebe ich zu, 
aber ich brauche die später

Autor: Edi R. (edi_r)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es wird Zeit, den Fehler systematisch einzukreisen. Mein Vorschlag für 
einen ersten Schritt:
  while(1){
    LATB++;
  }
um erst mal zu sehen, ob das Hochzählen und das Ausgeben auf dem Port 
funktioniert.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habe ausprobiert, hochzählen ohne if anweisung geht

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also ausgabe am port B funktioniert mit dem code:

while(1){
    LATB++;
  }

Autor: Edi R. (edi_r)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nächster Schritt:
 while(1){
    if(PORTAbits.RA0) LATB++;
 }
um zu sehen, ob der Eingang abgefragt wird.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
while(1){
    if(PORTAbits.RA0) LATB++;
 }
funzt nicht!!! keine ahnung warum????

Autor: Edi R. (edi_r)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es kann entweder an der Hardware liegen (falscher Portpin, Chip defekt) 
oder an der Software. Falls es die Software ist, kann man das weiter 
einkreisen.

Nächster Schritt:
 while(1){
    LATB = PORTA;
 }
Damit müsste man am RB0 sehen, was an RA0 geändert wird.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
keine reaktion auf dem port B egal ob ich die 1 anlege oder nicht

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich denke, dass es mit dem compiler probleme gibt, da ich zwei bausteine 
habe von der sorte pic18f1320, un bei den beiden das gleiche

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habe compiler neu installiert auf dem anderen rechner das gleiche 
ergebnis, wie kann ich die eingänge beim pic abfragen, wiso geht das 
nicht????

Autor: Hey Mann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mach doch mal

while(1){
  LATB=PORTA;
}

und schau was passiert, wenn du PORT A bit 0 high oder low setzt.

Autor: pic pig (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schon einmal im single step versucht, die
Portänderung nachzuvollziehen ?
Da müsstest Du doch sehen, ob eine Änderung
feststellbar ist im Eingang.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich bekomme ein ergebnis am portb, nur wenn ich porta als ausgang 
definiere, keine ahnung warum, was soll das, aber bin schritt weiter, 
danke dir

Autor: Luke patrick Dunwell (lpdunwell)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du hast vermutlich den ADC aktiv auf PORTA...

[edit]
Aus Datenblatt:

Note: On a Power-on Reset, RA3:RA0 are
configured as analog inputs and read as
‘0’. RA4 is always a digital pin.
[/edit]

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wird der nicht mit ADCON1 = 0x7f; abgeschaltet??

Autor: Luke patrick Dunwell (lpdunwell)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oh ja stimmt

Autor: Hey Mann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mit ADCON0.ADON=0 wird er abgeschaltet

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also lansamm möchte ich einen hammer nehmen und alles um mich herum 
schön klein machen

Autor: Michael Leusink (hasimaus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

nochmal kurz zurückgespult.

Du willst Port B für die Ausgabe eines 8Bit Wertes benutzten.
Mit TRISB=0b11110000; setzt Du aber nur die unteren vier Bit auf 
Ausgang, glaube ich.
Zudem lass ich kürzlich in einem anderen Thread, dass 0bxxxxxxx für 
Binärdarstellung nicht von allen Kompilern verstanden wird.
Versuch mal
   TRISB=0x00;
Damit werden alle Bits als Ausgänge definiert.
Versuch mal
   TRISA=0x1F ;
Damit sind die untern 5Bits Eingäng

Gruß

Autor: Michael Leusink (hasimaus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Hey Mann
Ich vermute, dass durch "ADCON0.ADON=0" nur das Modul selbst 
abgeschaltet wird, die I/O Konfiguration über "ADCON1 = 0x7f;" muß 
trotzdem noch erfolgen.
So geht's jedenfalls bei den meisten uC.

Gruß

Autor: Luke patrick Dunwell (lpdunwell)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also
volatile unsigned char marke=0;

main( void )
{
  //Configure port A
  TRISA=0xff;
  //Configure port B
  TRISB=0x00;
  
  //Initialize port B
  LATB=0x00;

  ADCON = 0x7f;
  
  while(1)
  {
    if(PORTA & 0x01) marke=1; else marke=0;
    if(marke) LATB++;
  }

}

funktioniert bei mir...

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also noch mal, hier ist das programm:

volatile unsigned int marke=0;
#define A1 PORTAbits.RA1
void main(void)
{
 TRISB=0x00;
 TRISA=0x1f;
 ADCON1 = 0x7f;           // Alle Ausgänge/Eingänge auf Digital I/O 
setzen
 ADCON0bits.ADON=0;
 LATB=0x00;
 LATA=0x00;
 while(1){
  if(PORTAbits.RA0){
  LATB++;
    }
}

}

wenn ich porta bitstelle null mit H belege, muss doch der µC am PORTB 
hochzählen, oder??? da passiert nichts alle led's sind dunkel, wenn ich 
eine bitkombination an dem PORTB anlege z.b. LATB=0x05 es funktioniert, 
keine ahnung was da noch falsch sein kann?

Autor: Michael Leusink (hasimaus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Luke patrick Dunwell

Entschuldige bitte, wenn ich so kleinlich bin, aber muß es statt

   ADCON = 0x7f;

nicht

   ADCON1 = 0x7f;

heißen ? Geht das dann auch noch bei Dir ?
Gruß

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
welchen µc hast du?

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja ich habe ADCON1! mal ausprobieren, warte

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ne habe jetzt im datenblatt gesehen war ADCON1 register

Autor: sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt. Laut Datenblatt heißen die ADCON0, ADCON1, und ADCON2.

Autor: Michael Leusink (hasimaus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Thomas
Hab' mir gerade mal den Kompiler Users Guide Nummer_5-mäßig reingezogen.
Danach bestätigt sich meine erste Vermutung, dass Bit-Werte mit 
0bxxxxxxx nicht möglich sind.
Es scheint jedoch möglich, über "0" bzw "<>0" die IF Abfrage zu 
kontrollieren. Trotzdem möchte ich vorschlagen, die Abfrage so zu ändern 
wie von Luke vorgeschlagen.
Nur so nebenbei, gibt's einen Schaltplan ?

Gruß

Autor: Luke patrick Dunwell (lpdunwell)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael Leusink schrieb:
> @Luke patrick Dunwell
>
> Entschuldige bitte, wenn ich so kleinlich bin, aber muß es statt
>
>    ADCON = 0x7f;
>
> nicht
>
>    ADCON1 = 0x7f;
>
> heißen ? Geht das dann auch noch bei Dir ?
> Gruß

ist eine sache der defines bei mir.

Autor: Marcus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael Leusink schrieb:
> ... Nicht alle Kompiler verstehen "<>0" als "TRUE" und "0"
> ... als "FALSE". Somit wird die "IF" Abfrage auf "0" nicht unbedingt
> korrekt

Doch!
 
if ( PORTAbits.RA0 ) {

}

ist gültiger Code. Wer's expliziter mag, schreibt:
 
if ( PORTAbits.RA0 == 1 ) {

}

beide Ausdrücke evaluieren identisch.


Michael Leusink schrieb:
> Hab' mir gerade mal den Kompiler Users Guide Nummer_5-mäßig reingezogen.
> Danach bestätigt sich meine erste Vermutung, dass Bit-Werte mit
> 0bxxxxxxx nicht möglich sind.

Ich weiss ja nicht, welchen Users-Guide Du gelesen hat, der vom MCC18 
war's definitv nicht. Der (MCC18) kann's nämlich.


@ThreadOpener:

Für solche geschichten sind LEDs als debugging-output aufgrund der hohen 
Taktfrequenzen denkbar ungeeignet.
Definiere Dir für den MPLAB Simulator einen Stimulus für RA0 und bring' 
das Ganze erstmal im Debugger zum laufen.

Wenn es im Debugger läuft kannst Du dich voll und Ganz auf Deine 
HArdware konzentrieren. Ist sichergestellt, daß du den PIN auf 
ordentliche Pegel ziehst ?

Viel Erfolg, nur die Ruhe bewahren!

Autor: Michael Leusink (hasimaus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Markus
Danke für den Hinweis, hab ich wohl beim schnellen Querlesen doch 
übersehen.

@Thomas
Nachdem soviele geholfen haben und Hinweise gaben, was ist den aus dem 
Programm geworden ?

Gruß

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das programm funktioniert, danke an alle, habe hardwarefehler gehabt, 
das war das problem, aber nach dem richtigen hinweis von Markus konnte 
ich es koregieren. noch mal danke an alle!!! und wünsche allen ein 
schönes fest!!!

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.