Bonsoir,
Je me suis remis au C sur PIC depuis hier, jusqu'à maintenant tout allait bien. Mais pour éviter l'attente active, j'aimerais utiliser le TIMER1 en interruption.
J'ai donc cherché des exemple de code donné par microchip (je sais je suis feignant) et j'ai essayé de les adaptés quelque peu affin d'obtenir ce que je veux.
Seulement, ça ne fonctionne malheureusement pas. Je code sous MPLAB, et j'utilise un compilateur qui est fourni dans la dernière version: HI-TECH C Compiler for PIC10/12/16 MCUs (Lite Mode) V9.70
Voici mon bout de code, pour l'initialisation du Timer1, et la fonction interruption.
Mon principal souci, c'est que je doute que le #pragma origin 4 soit juste. Seulement, je n'ai pas d'autre idée pour atteindre le vecteur d'interruption.Code:#include <pic.h> /* cADC - Display the PICkit Pot Input Value on the built in LEDs This program samples the voltage on RA0 using the ADC and Displays the value on the 8 LEDs using "cLEDDisp 2" as a base. myke predko 04.10.03 */ __CONFIG(INTIO & WDTDIS & PWRTEN & MCLRDIS & UNPROTECT \ & UNPROTECT & BORDIS & IESODIS & FCMDIS); int i, j,iEnd=230; int FLAG=0; int ADCState = 0; // Keep Track of ADC Operation int ADCValue = 0; int Dlay = 63; // LED Time on Delay Variable #pragma origin 4 void interupt(void) { if(TMR1IF==1) { TMR1IF=0; FLAG=1; } } void TMR1Setup(void) { // Use TMR1 for a 300 ms delay T1CON = 0b00110001; // TMR1 On/Internal Clock, 8x Prescaler TMR1H = (65536 - (300000 / 8)) >> 8; // Initialize a 300 ms delay TMR1L = (65536 - (300000 / 8)) & 0xFF; PEIE = 1; // Enable Peripheral Interrupts GIE = 1; // Global Interupt Enable TMR1IF = 0; // Turn off Pending Interrupt Requests TMR1IE = 1; // Enable TMR1 Overflow to Request Ints } main() { TMR1Setup(); TRISA = 0xff; TRISC0=0; PORTA = 0; ANSEL = 1; // Just RA0 is an Analog Input ADCON0 = 0b00000001; // Turn on the ADC // Bit 7 - Left Justified Sample // Bit 6 - Use VDD // Bit 4:2 - Channel 0 // Bit 1 - Do not Start // Bit 0 - Turn on ADC ADCON1 = 0b00010000; // Selemct the Clock as Fosc/8 while(1 == 1) // Loop Forever { switch (ADCState) // ADC State Machine { case 0: // Finished, Start Next Sample GODONE = 1; ADCState++; break; case 1: // Wait for ADC to complete if (!GODONE) ADCState++; // Sample Finished break; case 2: // Save Sample Value in "ADCValue" ADCValue = ADRESH; for (i = 0; i < iEnd; i++) // Delay Loop for (j = 0; j < (ADCValue+10); j++); NOP(); // Breakpoint Here RC0 = RC0 ^ 1; // Toggle LED ADCState = 0; if(FLAG==0) { NOP(); } break; } // hctiws } // elihw } // End cADC
Voila, merci à ceux qui m'aideront
-----