#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???
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
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?
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?!
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++".
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ß
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
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.
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]
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ß
@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ß
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?
@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ß
@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ß
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.
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!
@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ß
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!!!