Warum funktioniert dieses programm nicht

Gast #1652926
#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???
Gast #1652952
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?
#1653449
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?!
#1653458
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++".
#1653477
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ß
Gast #1653486
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
#1653523
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.
Gast #1653729
Schon einmal im single step versucht, die
Portänderung nachzuvollziehen ?
Da müsstest Du doch sehen, ob eine Änderung
feststellbar ist im Eingang.
#1653791
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ß
#1653795
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...
Gast #1653811
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
@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
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
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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.