mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC 16F876 Timer Interrupt


Autor: walli_l (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute.

Mein Chef hat mir ein selbstgebastelten Multiplexer in die Hand gedrückt 
und mir nahegelegt, eine eigentlich simple Aufgabe damit zu 
programmieren.

Die Aufgabe: Nach Tastendruck verschiedene LED's für 400 ms zum leuchten 
bringen, anschliessend LED's ausschalten und warten, bis eine Taste 
gedrückt wurden.

Diese Aufgabe habe ich auch hinbekommen, indem ich einfach nur
LED_ON(x)
delay_ms(400)
LED_OFF(x)
delay(400)
(x steht für verschiedene LED :-)

in C geschrieben habe.

Nun möchte ich aber jeweils die Zeit mit ausgeben, wann welche LED 
aufgeleutet hat.
also z.B.

Zeit : 0    LED1
Zeit : 800  LED2
Zeit : 1600 LED3
...

Ich habe versucht, mich in Interrupts und timer einzulesen, allerdings 
verstehe ich das nicht...bin so langsam verzweifelt und suche um Rat.

Hier ein Code für die Interrupts, das ich irgendwo gefunden habe und 
versucht habe, das zu modifizieren.

Nach Tastendruck einfach mal eine gewisse Zeit (hier anfangs 50*20 = 
1000us = 1 ms) warten und dann diese Zeit ausgeben. anschliessend wird i 
incrementiert sodass beim nächsten mal 51*20 us gewartet wird usw...

Damit wollte ich nur testen, was für eine Zeit die Variable time 
ausgibt.


#use rs232(baud=57600,xmit=PIN_C6,rcv=PIN_C7)   
#use delay(clock=20000000)                     


int16 overflow_count;


#int_timer1
timer1_isr() {
overflow_count++;
}


main() {
int32 time;
int key_0;
int j;
int i = 0;


setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
enable_interrupts(int_timer1);


while(TRUE) {

i++;
j = 1;


printf("Please press a key to start \n");

key_0=getc();

if (key_0==27){
   break;
 }

enable_interrupts(global);

set_timer1(0);
overflow_count=0;

while(j<i+50){

delay_us(20);

j++;
}

disable_interrupts(global);
time = get_timer1();


time = time + (overflow_count<<16);
time -= 15; // subtract overhead
printf("Time is %lu.%06u seconds.\r\n",time/5000000, (time/5)%1000000);
printf("Time is %u milliseconds.\r\n",time/5000);


}
}


Leider gibt mir dieser Code nicht das zurück, was ich erwartet habe.

Kann mir jemand sagen, wie ich das hinbekomme, oder ob das überhaupt 
geht und kann mir evtl. jemand dann ein Code zeigen, wie das 
realisierbar ist?

Ich habe leider kein Datasheet oder so ähnliches, auf dem Chip steht 
aber
PIC16F876 - SP/20

Der Compiler ist CCS S.

Vielen Dank im Voraus.

Gruß Walter

Autor: TommyS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich habe leider kein Datasheet oder so ähnliches

Komisch. Zum Forum kommt man, aber auf die Microchip-Seite nicht. 
Komische Firewall-Policy...

http://ww1.microchip.com/downloads/en/DeviceDoc/30292c.pdf

Grüße,
TommyS

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. datasheet besorgen (siehe link oben) ist nie verkehrt wenn man's mit 
einem unbekannten prozessor zu tun hat.

2. tipp von mir: wenn du mit nem PIC so eine einfache aufgabe lösen 
willst ist assembler dein freund. schau mal auf www.sprut.de, da wird 
alles super beschrieben. c ist meiner meinung nach hier völlig überladen 
und macht die sache nur komplizierter als sie ist.

hast du den code nur in einem simulator oder im zielchip getestet?

btw: ein pic16F... ist ein 8bit-controller, der tut sich mit 16 bit 
schwer... ich weiß natürlich nicht wie der compiler das löst... könntest 
du mal dein fertiges hex-file hochladen oder noch besser ein 
assembler-listing deines compilierten codes?

und was macht printf?? wo soll denn ein pic das hinprinten? auf die 
RS232?

Autor: walli_l (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
> 1. datasheet besorgen

Erledigt!

> 2. Asm-File
Habe ich als Txt-Datei eingefügt, da das eine echt lange List ist

> und was macht printf?? wo soll denn ein pic das hinprinten? auf die
RS232?

Ja, das kann ich z.B. im HyperTerminal ausgeben lassen.

Gruß Walter

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.