mikrocontroller.net

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


Autor: Holla Die waldfee (schlucke)
Datum:

Bewertung
0 lesenswert
nicht 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?IdcServic...)

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=Stor... 
ICD-U40 Schnittstelle 
http://www.ccsinfo.com/product_info.php?cPath=Stor...)
  #include <stdio.h>


void main()
{

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_spi(SPI_SS_DISABLED);
   setup_lcd(LCD_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);



   if (input(PIN_A0))
      output_high (PIN_B1);
   else
      output_low (PIN_B1);
}

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

Autor: Holla Die waldfee (schlucke)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
anhang vergessen

Autor: Schoasch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Holla Die waldfee (schlucke)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

#include <16F917.h>
#device ICD=TRUE
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES NOIESO                   //Internal External Switch Over mode disabled
#FUSES NOFCMEN                  //Fail-safe clock monitor disabled
#FUSES NODEBUG                  //No Debug mode for ICD

#use delay(clock=32768)


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

Autor: Schoaschi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Die Lösung steht genau vor dir ;-)
#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).
#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

Autor: Holla Die waldfee (schlucke)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Funktionieren denn wenigstens die Beispielprogramme von Microchip?

Severino

Autor: Holla Die waldfee (schlucke)
Datum:

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

Autor: tt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PIC Assembler unterscheidet je nach Einsellung zwischen 
Groß/Kleinschreibung

---_ das ding heist PORTA

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht 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
>
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?

Autor: Holla Die waldfee (schlucke)
Datum:

Bewertung
0 lesenswert
nicht 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.
#include <led.h>
#include <stdio.h>
#include <16F917.h>

#FUSES XT
#use delay(clock=32768)


void main()
{

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_spi(SPI_SS_DISABLED);
   setup_lcd(LCD_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

#asm
bsf      STATUS,RP0
bcf      TRISD,7    //is output
bsf      TRISA,0    //is input
movlw    b'10000110'
movwf    OPTION_REG
movlw    0x07
movwf    CMCON
clrf     ANSEL
bcf      STATUS,RP0
#endasm
   
   if(!input(PIN_A0))
      output_high(PIN_D7);
   else
      output_low(PIN_D7);
}

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'

Autor: Schoasch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

mfg Schoasch

Autor: Holla Die waldfee (schlucke)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Holla Die waldfee (schlucke)
Datum:

Bewertung
0 lesenswert
nicht 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??

Autor: Holla Die waldfee (schlucke)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.fernando-heitor.de/components/com_openw...

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

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

Autor: Holla Die waldfee (schlucke)
Datum:

Bewertung
0 lesenswert
nicht 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
#FUSES NOFCMEN    //Fail-safe clock monitor disabled

raus nimmt funktioniert das auch mit 4 MHz.

Autor: Schoasch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 = PORTA pin configured as an input (tri-stated)
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:
TRISA = 0x01; // TRISA0 wird auf 1 gesetzt->RA0 = input, other output
while(1){
 while( !(PORTA && 0x01) )
  { 
   //Hier liest du den PORTA ein und maskierst in 
   //mit 0x01... damit erhältst du genau das Bit0 
   //des PORTA-Resgister-- sprich den Zustand an RA0
   //Da aber der Taster 0 zurückgibt wenn er betätig wird, musst du halt
   // das ergebnis invertieren
  PORTA = 0x02;
  //eventuell gehört hier nich eine kleine Pause hinein->read-modify-write
  }
PORTA=0;
}

Soderla... normal sollte das funktionieren... getestet hab ichs aber 
nicht ;-)

Aja.. damit das Funktioniert, musst du das PORTA und das TRISA-Register 
zuerst definieren:
#byte TRISA  = 0x85
#byte PORTA  = 0x05
#bit  RA0    = PORTA.0
#bit  RA1    = PORTA.1
Mit den Letzten 2 Zeilen kannst du dan Bitweise zugreifen. Dann würde 
der Code wie folgt aussehen:
TRISA = 0x01; // TRISA0 wird auf 1 gesetzt->RA0 = input, other output
while(1){
 while( !(RA0) )
  { 
    RA1 =1;
  //eventuell gehört hier nich eine kleine Pause hinein->read-modify-write
  }
PORTA=0;
}

mfg Schoasch

Autor: Holla Die waldfee (schlucke)
Datum:

Bewertung
0 lesenswert
nicht 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:
while(1)
{
   if(input(PIN...)
      output_high(...);
   else
      output_low(...);
}

aber es werden sich bestimmt noch mehr fragen auftun, werd mich dann 
nochmal melden. die haben dan evtl etwas mehr anspruch.

;)

Gruß,

Andreas

Autor: Schoasch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Holla Die waldfee (schlucke)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke danke

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.