Forum: Mikrocontroller und Digitale Elektronik PICDEM Mechatronics Board mit PIC 16F917


von Holla D. (schlucke)


Lesenswert?

Hallo,

ich brauche Hilfe!

nennt mich Anfänger wenn Ihr wollt, währe trotzdem nett wenn ihr mir 
helfen könntet.
Ich arbeite zur Zeit mit einem PICDEM Mechatronics DEMO Board von 
Microchip
(http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en023837&part=DM163029)

Ich habe versucht mit folgendem C-Code versucht eine LED über einen 
Taster zu schalten.
(CCS-Compiler 
http://www.ccsinfo.com/product_info.php?cPath=Store&products_id=PCWH_fullmit 
ICD-U40 Schnittstelle 
http://www.ccsinfo.com/product_info.php?cPath=Store&products_id=ICDU40)
1
  #include <stdio.h>
2
3
4
void main()
5
{
6
7
   setup_adc_ports(NO_ANALOGS|VSS_VDD);
8
   setup_adc(ADC_OFF);
9
   setup_spi(SPI_SS_DISABLED);
10
   setup_lcd(LCD_DISABLED);
11
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
12
   setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1);
13
   setup_timer_2(T2_DISABLED,0,1);
14
   setup_comparator(NC_NC_NC_NC);
15
   setup_vref(FALSE);
16
17
18
19
   if (input(PIN_A0))
20
      output_high (PIN_B1);
21
   else
22
      output_low (PIN_B1);
23
}

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,.

von Holla D. (schlucke)


Angehängte Dateien:

Lesenswert?

anhang vergessen

von Schoasch (Gast)


Lesenswert?

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

von Holla D. (schlucke)


Lesenswert?

1
#include <16F917.h>
2
#device ICD=TRUE
3
#device adc=8
4
5
#FUSES NOWDT                    //No Watch Dog Timer
6
#FUSES XT                       //Crystal osc <= 4mhz
7
#FUSES NOPUT                    //No Power Up Timer
8
#FUSES NOPROTECT                //Code not protected from reading
9
#FUSES NOMCLR                   //Master Clear pin used for I/O
10
#FUSES NOCPD                    //No EE protection
11
#FUSES BROWNOUT                 //Reset when brownout detected
12
#FUSES NOIESO                   //Internal External Switch Over mode disabled
13
#FUSES NOFCMEN                  //Fail-safe clock monitor disabled
14
#FUSES NODEBUG                  //No Debug mode for ICD
15
16
#use delay(clock=32768)

????????????????????????????????????????????????????????????????

von Schoaschi (Gast)


Lesenswert?

Hi

Die Lösung steht genau vor dir ;-)
1
#FUSES NODEBUG                  //No Debug mode for ICD
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

von Holla D. (schlucke)


Lesenswert?

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

von Severino R. (severino)


Lesenswert?

Funktionieren denn wenigstens die Beispielprogramme von Microchip?

Severino

von Holla D. (schlucke)


Lesenswert?

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
clrf porta
anfangen. der sagt mir dann
>>undefinde identifier porta

von tt (Gast)


Lesenswert?

PIC Assembler unterscheidet je nach Einsellung zwischen 
Groß/Kleinschreibung

---_ das ding heist PORTA

von Severino R. (severino)


Lesenswert?

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

von Holla D. (schlucke)


Lesenswert?

>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
void main()
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
bsf      STATUS,RP0
24
bcf      TRISD,7    //is output
25
bsf      TRISA,0    //is input
26
movlw    b'10000110'
27
movwf    OPTION_REG
28
movlw    0x07
29
movwf    CMCON
30
clrf     ANSEL
31
bcf      STATUS,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'

von Schoasch (Gast)


Lesenswert?

Hi

Was willst du denn mit dem ASM-Code da jetzt machen?!

So ganz check ich jetzt nicht wo dein Problem ist.

Hier gibts einiges zum lesen:

http://www.fernando-heitor.de/component/option,com_openwiki/Itemid,123/

mfg Schoasch

von Holla D. (schlucke)


Lesenswert?

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

von Holla D. (schlucke)


Lesenswert?

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

von Holla D. (schlucke)


Lesenswert?

http://www.fernando-heitor.de/components/com_openwiki/lib/exe/fetch.php?id=tutorials%3Accs%3Akapitel_2&cache=cache&media=tutorials:ccs:tutorial12.zip

ich hab das projekt eins zu eins abgetippt und es läuft nicht. wenn ich 
das fertige projekt benutze läuft es 1A

???????????????????????????????????????????????????????????????????????

von Holla D. (schlucke)


Lesenswert?

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
1
#FUSES NOFCMEN    //Fail-safe clock monitor disabled

raus nimmt funktioniert das auch mit 4 MHz.

von Schoasch (Gast)


Lesenswert?

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
7
  }
8
PORTA=0;
9
}

mfg Schoasch

von Holla D. (schlucke)


Lesenswert?

>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

von Schoasch (Gast)


Lesenswert?

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

von Holla D. (schlucke)


Lesenswert?

Danke danke

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.