Warum funktioniert dieses programm nicht

Gast #1652926
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???
#1653477
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ß
#1653523
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:
1
 while(1){
2
    LATB = PORTA;
3
 }
Damit müsste man am RB0 sehen, was an RA0 geändert wird.
#1653791
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ß
Gast #1653811
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?
#1653926
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ß
Gast #1654191
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!
1
 
2
if ( PORTAbits.RA0 ) {
3

4
}

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

4
}

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!
Gast #1657962
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren