wenn ich das Programm auf meinen PIC lade passiert jedoch nix. wenn ich
dann über die ICD debugge gibt mir der debugger die angehängte
fehlermeldung aus.
egal wie ich den osc einstelle es ändert sich nichts.
hat da jemand ne idee?? Auf kommentare wie nimm nen anderen uC oder
ähnliche kann ich verzichten.
Danke schonmal im Voraus,.
Hi
Benutzt du #use FAST_IO? NAja.. so oder so solltest du die TRIS-Register
immer selbst setzen.
Wie sind denn die Fuses gesetzt? Hast du Debug-Enabled aktiviert?
Achja und deine Abfrage stimmt auch nicht ganz. Beim betätigen der Taste
ziehst du den Pin auf Low!
mfg Schoasch
Wenn du debuggen willst und du aber diesen mode nicht aktiviert hast,
wird sich da was spiessen (hab selbst noch nie debugged).
1
#FUSES NOMCLR //Master Clear pin used for I/O
Wenn du den Pin nicht unbedingt benötigst oder es keinen zwingenden
grund gibt, dann solltest du MCLR auch als MCLR verwenden und nicht als
IO.
mfg Schoasch
Die sache mit dem nodebug ist mir auch schon aufgefallen, da weist einen
der debugger sogar drauf hin. aber selbst wenn ich den mclr ändere tut
sich nix
ich werd nochma blöde mit der scheise hier ...
Ja die funktionieren, aber in asm ich hab aber die aufgabe das alles
schön in c zu tun.
hab dann grad mal versucht die pinne in asm zu deklarieren und das in
den c code einzubinden, aber da kann der compiler irgendwie nix mit
1
clrfporta
anfangen. der sagt mir dann
>>undefinde identifier porta
Andreas H. wrote:
> Ja die funktionieren, aber in asm ich hab aber die aufgabe das alles> schön in c zu tun.>> hab dann grad mal versucht die pinne in asm zu deklarieren und das in> den c code einzubinden, aber da kann der compiler irgendwie nix mit>
1
clrfporta
> anfangen. der sagt mir dann>>>undefinde identifier porta
Wenn es sich um Inline-Assembler handelt (wohl schon, wenn der Compiler
meckert und nicht der Assembler), ist nicht mal sicher, dass er die in C
definierten Symbole auch für den Assembler-Teil kennt!
Was meinst Du mit "die pinne in asm zu deklarieren" ?
Wenn Dir das mit dem NODEBUG schon aufgefallen ist, hast Du es nun
korrigiert oder übst Du noch mit der geposteten Version?
>NODEBUG
hab ich geändert
>---_ das ding heist PORTA
hab ich auch probiert
vielleicht habe ich das auch falsch verstanden, dass ich den
assemblercode in den c code einbauen kann, oder ich habe eben dieses
falsch gamacht.
1
#include<led.h>
2
#include<stdio.h>
3
#include<16F917.h>
4
5
#FUSES XT
6
#use delay(clock=32768)
7
8
9
voidmain()
10
{
11
12
setup_adc_ports(NO_ANALOGS|VSS_VDD);
13
setup_adc(ADC_OFF);
14
setup_spi(SPI_SS_DISABLED);
15
setup_lcd(LCD_DISABLED);
16
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
17
setup_timer_1(T1_DISABLED);
18
setup_timer_2(T2_DISABLED,0,1);
19
setup_comparator(NC_NC_NC_NC);
20
setup_vref(FALSE);
21
22
#asm
23
bsfSTATUS,RP0
24
bcfTRISD,7//is output
25
bsfTRISA,0//is input
26
movlwb'10000110'
27
movwfOPTION_REG
28
movlw0x07
29
movwfCMCON
30
clrfANSEL
31
bcfSTATUS,RP0
32
#endasm
33
34
if(!input(PIN_A0))
35
output_high(PIN_D7);
36
else
37
output_low(PIN_D7);
38
}
das ist dann mal mein code
aber wenn ich den compillieren will hängt er sich an folgenden stellen
auf.
>bsf STATUS,RP0
und
>movlw b'10000110'
>> fernando-heitor.de>In der Initialisierung sollten noch die Ports als Ein- oder Ausgänge>definiert werden. Mit dem Befehl "set_tris_X()" können die einzelnen Port>konfiguriert werden. Das X steht für das jeweilige Port, z.B.>set_tris_a() für Port A. Fast jeder Port (außer Port A, der eine>unterschiedliche Anzahl von Pins hat) hat 8 Ein- oder Ausgänge (Pins).>Wenn der bestimmte Pin als "1" definiert wird ist er als Eingang>konfiguriert, bei "0" als Ausgang. In unserem Beispiel werden alle Pins>als Ausgänge definiert und an Pin RB1 schließen wir direkt die LED an.>Unbenutzte Eingangspins sollten niemals unbeschaltet bleiben, da sonst>hohe Querströme von VDD nach VSS fließen können. Dadurch würde man den>PIC eventuell zerstören.>>Deshalb werden die unbenutzen Pins als Ausgänge definiert.
versteh ich ja auch alles, aber wie sage ich dem pic denn (letzter satz)
dass er nur einen eingangspin hat und der rest von a ausgänge sein
sollen, oder hab ich den text doch falsch verstanden??
das testprogramm läuft auch wenn ich das ein bisschen ummodele aber ich
will halt wissen warum meins dann nicht läuft, obwohl ich nicht wirklich
viel anders mache.
ich würde das halt gerne so machewn, dass ich die led über einen taster
ein bzw ausschalte.
alles klar, wer weiter liest ist klar im vorteil.
aber kann ich das nur mit einem interrupt realisieren, dass der pic die
led erst nach betätigung eines tasters schaltet??
Fürs Protokoll,
ich hab da irgendwie den taktgeber falsch initialisiert.
der externe gibt 32.768 Hz und ich hatte im programm eine frequenz von 4
MHz verwendet, wobei durch den fail-safe-clock-monitor der fehler
entstand.
wenn man
Hi
Du musst nicht zwingend einen Interrupt benutzen um auf einen Taster zu
reagieren.
Hast du schon mal im Datenblatt des PICs im Kapitel "I/O-Ports" etwas
nachgelesen? Dort steht eine beschreibung der TRIS und PORT register.
Dort siehst du den Aufbau des TRIS-Registers. und darunter steht:
1
1 = PORTA pin configured as an input (tri-stated)
2
0 = PORTA pin configured as an output
Also... wenn du jetzt zb den Wert "0b0000 1111"(0x0F) in das
TRISA-Register schreibst, dann ist des höherwertige Nibble(RA4 - RA7)
als Ausgang und das niederwertige Nibble(RA0-RA3) als Eingang
geschalten.
Sagen wir einmal an RA0 ist ein Taster( beim Betätigen wird geht er auf
0) und an RA1 ist eine LED( bei 1 Leuchtet sie). Dann musst du
folgendes machen:
1
TRISA=0x01;// TRISA0 wird auf 1 gesetzt->RA0 = input, other output
2
while(1){
3
while(!(PORTA&&0x01))
4
{
5
//Hier liest du den PORTA ein und maskierst in
6
//mit 0x01... damit erhältst du genau das Bit0
7
//des PORTA-Resgister-- sprich den Zustand an RA0
8
//Da aber der Taster 0 zurückgibt wenn er betätig wird, musst du halt
9
// das ergebnis invertieren
10
PORTA=0x02;
11
//eventuell gehört hier nich eine kleine Pause hinein->read-modify-write
12
}
13
PORTA=0;
14
}
Soderla... normal sollte das funktionieren... getestet hab ichs aber
nicht ;-)
Aja.. damit das Funktioniert, musst du das PORTA und das TRISA-Register
zuerst definieren:
1
#byte TRISA = 0x85
2
#byte PORTA = 0x05
3
#bit RA0 = PORTA.0
4
#bit RA1 = PORTA.1
Mit den Letzten 2 Zeilen kannst du dan Bitweise zugreifen. Dann würde
der Code wie folgt aussehen:
1
TRISA=0x01;// TRISA0 wird auf 1 gesetzt->RA0 = input, other output
2
while(1){
3
while(!(RA0))
4
{
5
RA1=1;
6
//eventuell gehört hier nich eine kleine Pause hinein->read-modify-write
>mfg Schoasch
vielen dank.
aber wie gesagt, mein haupt fehler lag darin, dass ich den ext osc
falsch eingbunden habe. hab das jetzt raus geschmissen und schon
funktionierts mit einem einfachen code wie:
1
while(1)
2
{
3
if(input(PIN...)
4
output_high(...);
5
else
6
output_low(...);
7
}
aber es werden sich bestimmt noch mehr fragen auftun, werd mich dann
nochmal melden. die haben dan evtl etwas mehr anspruch.
;)
Gruß,
Andreas
Ich empfehle dir, die Register selbst zu definieren und von Hand die
Register setzen... und nicht die CCS-Sonderfunktionen zu verwenden. Am
Anfang mags vl ganz einfach und angenehm sein. Doch irgendwann wirst du
merken, dass manchmal die Funktionen stören... und es manchmal
umständlich wird. Ausserdem brauchen sie mehr Performance..
(Gleich mal ein Tipp fürs weitere arbeiten ;-))
mfg Schoasch