Forum: Mikrocontroller und Digitale Elektronik Warum funktioniert dieses programm nicht


von Thomas (Gast)


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???

von Kai F. (kai-) Benutzerseite


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

von Flo (Gast)


Lesenswert?

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

von Thomas (Gast)


Lesenswert?

ok probiere gleich aus danke

von Thomas (Gast)


Lesenswert?

nein, leider hat nicht geholfen, das selbe ergebnis

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

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

von Thomas (Gast)


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?

von Thomas (Gast)


Lesenswert?

könnte es sein, dass die if anweisung falsch ist?

von hallo (Gast)


Lesenswert?

42

von Rene K. (draconix)


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?!

von Thomas (Gast)


Lesenswert?

ja das ist pic18f1320 und ent. umgebung ist mplab c18

von Edi R. (edi_r)


Lesenswert?

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

von Thomas (Gast)


Lesenswert?

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

von Edi R. (edi_r)


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++".

von Thomas (Gast)


Lesenswert?

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

von Thomas (Gast)


Lesenswert?

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

von Michael L. (hasimaus)


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ß

von Thomas (Gast)


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

von Edi R. (edi_r)


Lesenswert?

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

von Thomas (Gast)


Lesenswert?

habe ausprobiert, hochzählen ohne if anweisung geht

von Thomas (Gast)


Lesenswert?

also ausgabe am port B funktioniert mit dem code:

while(1){
    LATB++;
  }

von Edi R. (edi_r)


Lesenswert?

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

von Thomas (Gast)


Lesenswert?

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

von Edi R. (edi_r)


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.

von Thomas (Gast)


Lesenswert?

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

von Thomas (Gast)


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

von Thomas (Gast)


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????

von Hey Mann (Gast)


Lesenswert?

mach doch mal

while(1){
  LATB=PORTA;
}

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

von pic pig (Gast)


Lesenswert?

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

von Thomas (Gast)


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

von Luke patrick D. (lpdunwell)


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]

von Thomas (Gast)


Lesenswert?

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

von Luke patrick D. (lpdunwell)


Lesenswert?

oh ja stimmt

von Hey Mann (Gast)


Lesenswert?

mit ADCON0.ADON=0 wird er abgeschaltet

von Thomas (Gast)


Lesenswert?

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

von Michael L. (hasimaus)


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ß

von Michael L. (hasimaus)


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ß

von Luke patrick D. (lpdunwell)


Lesenswert?

also
1
volatile unsigned char marke=0;
2
3
main( void )
4
{
5
  //Configure port A
6
  TRISA=0xff;
7
  //Configure port B
8
  TRISB=0x00;
9
  
10
  //Initialize port B
11
  LATB=0x00;
12
13
  ADCON = 0x7f;
14
  
15
  while(1)
16
  {
17
    if(PORTA & 0x01) marke=1; else marke=0;
18
    if(marke) LATB++;
19
  }
20
21
}

funktioniert bei mir...

von Thomas (Gast)


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?

von Michael L. (hasimaus)


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ß

von Thomas (Gast)


Lesenswert?

welchen µc hast du?

von Thomas (Gast)


Lesenswert?

ja ich habe ADCON1! mal ausprobieren, warte

von Thomas (Gast)


Lesenswert?

ne habe jetzt im datenblatt gesehen war ADCON1 register

von sven (Gast)


Lesenswert?

Stimmt. Laut Datenblatt heißen die ADCON0, ADCON1, und ADCON2.

von Michael L. (hasimaus)


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ß

von Luke patrick D. (lpdunwell)


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.

von Marcus (Gast)


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!

von Michael L. (hasimaus)


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ß

von Thomas (Gast)


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!!!

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.