PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PIC Programmierung (18F2455)



mf01
10.03.2006, 13:51
Hallo,
Für ein Projekt in der Schule müssen wir einen PIC programmieren.
Jedoch kennen wir uns mit der PIC Programmierung kaum aus und so
funktioniert unser erstes Programm nicht. Vielleicht könnte einer von
euch das Programm ansehen und uns helfen es lauffähig zu bekommen.
Wir programmieren mit MPLAB 7.31 und dem C18 Compiler (MCC18).
Eventuell liegt der Fehler auch an Einstellungen die man im Programm
vornehmen muss.
Ich hoffe, ihr könnt uns helfen.</pre>

Winne
10.03.2006, 15:36
index= !(PORTBbits.RB4)*1 + !(PORTBbits.RB5)*2 + !(PORTCbits.RC0)*4 + !(PORTCbits.RC1)*8;



Könnte es sein das Du die Bits erst wichten und dann negieren solltest, statt umgekehrt.

index= !((PORTBbits.RB4)*1) + !((PORTBbits.RB5)*2) + !((PORTCbits.RC0)*4) + !((PORTCbits.RC1)*8);

Peter Dannegger
10.03.2006, 15:50
...und so funktioniert unser erstes Programm nicht.


Glaubst Du allen Ernstes, wenn Du keine Lust hast zu sagen, was nicht geht, daß ein anderer Lust hat, Deine Faulheit zu unterstützen ???

Träum weiter.


Ein kleines bischen Einsatz muß man schon zeigen.


Peter

mf01
10.03.2006, 20:09
das man das erst gewichten muss glaube ich nicht
und Peter:
ich zeige schon seit Wochen Einsatz
aber ich ahbe keine Ahnung übers PIC_Prgorammieren und kenne auch niemanden der mir das beibringen kann
das haben wir auch nicht gelernt in der Schule
wäre schon sehr nett wenn ihr mir helfen könntet

Peter Dannegger
10.03.2006, 22:01
wäre schon sehr nett wenn ihr mir helfen könntet

Würden wir gerne, bloß wir können nicht in Deinen Kopf schauen.

Was hast du denn schon alles probiert ?

Hast Du überhaupt schon einmal ein Programm zum laufen gebracht ?

Man muß klein anfangen, z.B. ne LED einschalten, ne Taste abfragen usw.

Gleich ein Programm fertig zu schreiben und dann erst testen, können nur absolute Profis und selbst die nicht immer.


Peter

mf01
11.03.2006, 01:19
habe auch kleine Testprogramme geschrieben (für einzelne Leds etc.) die haben aber auch noch nicht funktioniert
ich habe leider kein Wissen über PICs
deswegen frage ich ja
wenn ich es selbst können würde müsste ich ja net fragen
das Problem ist das es ziehmlich dringend ist
ihr müsst euch ja nur das Programm anschauen und sagen wo Fehler liegen könnten oder was fehlt
da ich keine Erfahrung mit PICs habe, bin ich selber leider noch nicht drauf gekommen warum es nicht geht

Peter Dannegger
11.03.2006, 11:05
habe auch kleine Testprogramme geschrieben (für einzelne Leds etc.) die haben aber auch noch nicht funktioniert

Na das ist ja schon mal ne sehr wichtige Aussage, die Du uns bisher leider vorenthalten hast.

Wenn noch nie was lief, dann mußt Du Dich eben erstmal mit den Grundlagen beschäftigen, z.B.:

http://www.sprut.de/electronic/pic/index.htm

Man kann keinen Berg mit nur einem Schritt besteigen.


Peter

Winne
11.03.2006, 11:36
Mir hilft da einfach, mich in Fremde einfache Routinen hineizudenken um zu verstehen was passiert. Leider kann ich Dir ein solches Beispiel nicht bieten, da ich um Pics noch immer einen großen Bogen gemacht habe, obwohl oder gerade weil ich mich da mal eingelesen hatte. Die AVR sind mir da lieber:) , sie ähneln meiner geliebten 6502:D . Und die beherrsche ich, während der Pic wahrscheinlich mich beherrschte, mir mindestens aber schlaflose Nächte bereiten dürfte.:(


im übrigen ist !(1*4) <> (!1)*4

!(1*4) = 0b11111011
(!1)*4 = 0b11111000

soviel zum negieren und wichten

Peter Dannegger
11.03.2006, 11:58
!(1*4) = 0b11111011
(!1)*4 = 0b11111000

Das ist vollkommen falsch !

Der ! Operator ist die logische Negation, d.h. er liefert 1 zurück, wenn der Ausdruck 0 ist, ansonsten 0:

!(1*4) = 0
(!1)*4 = 0
!(0*4) = 1
(!0)*4 = 4

Die bitweise Negation ist der ~ Operator:

~(1*4) = 0b11111011
(~1)*4 = 0b11111000
~(0*4) = 0b11111111
(~0)*4 = 0b11111100


Peter

Winne
11.03.2006, 12:09
oops peter,

Da hab ich wohl geschlafen.

Trotzdem mutmaße ich, er müßte bitweise negieren sonst macht seine Programmzeile keinen Sinn und da kommt es eben auf die Reihenfolge an, außerdem ist dann wohl auch bittweise undieren richtiger als addieren oder stehe ich jetzt vollkommen auf dem Schlauch. So jetzt hat Winníe auch wieder was zum lästern, ihch habe mich zwichen den beiden Negatoroperatoren verannt:confused: :(

Peter Dannegger
11.03.2006, 12:30
Trotzdem mutmaße ich, er müßte bitweise negieren sonst macht seine Programmzeile keinen Sinn und da kommt es eben auf die Reihenfolge an, außerdem ist dann wohl auch bittweise undieren richtiger als addieren oder stehe ich jetzt vollkommen auf dem Schlauch.

Ich kann Dich beruhigen, die Zeile ist richtig.
Ich gebe aber zu, sie ist nicht gerade einfach zu verstehen und bestimmt nicht einem Anfänger eingefallen.

Funktional entspricht sie etwa folgendem:




index = 0;
if( !(PORTBbits.RB4))
index += 1;
if( !(PORTBbits.RB5))
index += 2;
if( !(PORTCbits.RC0))
index += 4;
if( !(PORTCbits.RC1))
index += 8;


Und wenn man immer nur verschiedene Bits addiert, gibt es keinen Überlauf auf höhere Bits und somit ist + und | und auch ^ gleich.

& wäre aber falsch, damit würdest Du die Bits löschen und nicht setzen.
Verschiedene Bits zu undieren ergibt immer 0.


Peter

Winne
11.03.2006, 12:38
Ich kann Dich beruhigen, die Zeile ist richtig.
Ich gebe aber zu, sie ist nicht gerade einfach zu verstehen und bestimmt nicht einem Anfänger eingefallen.

Funktional entspricht sie etwa folgendem:




index = 0;
if( !(PORTBbits.RB4))
index += 1;
if( !(PORTBbits.RB5))
index += 2;
if( !(PORTCbits.RC0))
index += 4;
if( !(PORTCbits.RC1))
index += 8;


Und wenn man immer nur verschiedene Bits addiert, gibt es keinen Überlauf auf höhere Bits und somit ist + und | und auch ^ gleich.

& wäre aber falsch, damit würdest Du die Bits löschen und nicht setzen.
Verschiedene Bits zu undieren ergibt immer 0.


Peter



Ja ich meinte auch er wolle eine lowaktive Logik. Aber nach dem das geklärt ist, ist auch klar das er weiter unten eine Fehler hat, da er als mögliche Inhalte von index nur 1,2,3und4 prüft, er müßte aber wenn es eine positive Logik sein die bits 0,1,2,3 prüfen mit den Wichtungen 1,2,4 und 8

Habe ich das jetz richtig oder sollte ich heute lieber den Lötkolben benutzen als nen Programm zu schreiben? ;)


sorry ich penne

Der hat index ja noch als zeiger auf nen inaktives arry benutzt. Heute lese ichs kein Programm mehr das ich nicht selbst geschrieben habe.

mf01
13.03.2006, 15:08
index= !(PORTBbits.RB4)*1 + !(PORTBbits.RB5)*2 + !(PORTCbits.RC0)*4 + !(PORTCbits.RC1)*8;

damit wollen wir 4 Pins negieren und unterschiedlich wichten
und dadurch einen bestimmten Wert aus der Zuweisungstabelle bekommen

const int zu_tab[16]={0,1,0,2,0,0,0,3,0,0,0,0,0,0,0,4};


zusätzlich habe ich eine aktuelle Version des Programms eingefügt
danke für Hilfe

mf01
31.03.2006, 14:30
Hallo,
wir haben jetzt ein neues Problem. Und zwar passt zwar das Programm aber der PIC schaltet jedesmal wenn man mit der Hand in die Nähe der Schaltung kommt. Woran könnte das liegen bzw. was kann man dagegen machen?

mfg mf01