Timer0 löst keinen Interrupt aus wenn ADC arbeitet
Dienstag, 22. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  CCS Compiler  |  AD-Wandler (CCS)  |  Timer0 löst keinen Interrupt aus wenn ADC arbeitet « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: Timer0 löst keinen Interrupt aus wenn ADC arbeitet  (Gelesen 2645 mal)
 
Daniel_Duene
Gast
« am: November 12, 2008, 21:12:39 »

Hallo!
Mein Name ist Daniel. Ich habe folgendes Problem: Wenn ich den ADC des PIC verwende springt der Timer0 nicht in die ISR.
Wenn ich den ADC nicht verwende funktioniert der Timerinterrupt.
Ich bin sehr unerfahren auf dem Gebiet und der Fehler könnte sehr einfach sein. Ich hoffe Ihr könnt mir helfen.

Schon mal im Voraus besten Dank
Daniel

Hier mein Code:
Code:
#include <16F877A.h>
#use delay(clock=8000000)
#fuses HS,NOWDT,PUT,NOLVP
#include"lcd_4b.c"
#define COL1   pin_b4
#define tecla pin_b0
#bit   AD_GO  = 0x1F.2
#bit ADW = 0x1F.0
//int16 ad_wert;
//#byte ADCON0=0x1F


void init()
{
setup_timer_0 (RTCC_DIV_128 | RTCC_INTERNAL);//2MHZ/126 = 15625 Hz.
set_timer0 (131);//12625/(256-131)=125
enable_interrupts (global | int_timer0);
setup_adc_ports(RA0_ANALOG);
setup_adc( ADC_CLOCK_INTERNAL );
portd = 0;
porta = 0;
porte = 0;
set_tris_d(0b00001111);
set_tris_e(0b11111100);
set_tris_a(0b00000001);
port_b_pullups(True);
output_low(COL1);
inicializa_lcd();
delay_ms(200);
}


void relogio()
{
static int i=0,flag=0;
i++;

while ((i==3) && (flag==0))
   {
   flag=1;
   disable_interrupts(int_timer0);
   limpa_lcd();
   printf(escreve_lcd,"MANUTENCAO");

      if (!input(tecla))
      {
         set_timer0 (131);//12625/(256-131)=125
         enable_interrupts (int_timer0);
         i=0;
         break;
      }
   }
}


#int_timer0//Wenn interrupt ausgelöst wird springe in die folgende Funktion
void timer0_interrupt()
{
static int contador,i=0;
set_timer0 (131 + get_timer0());
disable_interrupts(INT_AD);
contador++;

if(contador == 125)
   {
   contador = 0;
   relogio();
   }
}



void main()
{

long adc1;
init();

while (true)
   {
   set_adc_channel(0);
   delay_us(500);
   adc1 = read_adc();
   delay_us(50);
   lcd_pos_xy(1,1);
   printf(escreve_lcd,"ADWert: %lu", adc1);
   }
}
Gespeichert
bemi
Full Member
***
Offline Offline

Beiträge: 193


Profil anzeigen WWW
« Antworten #1 am: November 15, 2008, 11:04:19 »

Hi,

ich habe zwar schon lange nichts mehr mit den PIC16 gemacht und auch noch nie in C, aber Du könntest mal ein paar Dinge kontrollieren.

Benutze unter MPLab mal den Simulator und laß Dir alle Register anzeigen, die für den Timer-Interrupt von Bedeutung sind.
Wenn ich mich recht erinnere sind das das INTCON Register (ist warscheinlich änlich dem PIC18). Da muß es ein Bit geben, welches anzeigt, ob Interrupts "Enabled" sind. Laß Dein Programm einfach mal ein paar Sekunden im MPLab Simulator laufen und klick dann auf Halt. Schau nach, ob daß entsprechende Bit GIE (beim PIC18, kann also auch anders heißen) noch gesetzt ist. Laß Dir auch mal alle Register anzeigen, die für den Timer interrupt wichtig sind und kontrolliere diese.

Grüße,
Bernd

Gespeichert

Projektseite: Amadeus-USB
Daniel_Duene
Gast
« Antworten #2 am: November 17, 2008, 16:53:45 »

Danke Bernd für deine Antwort.

Der Simulator im MPLAB hilft sehr. Habe das Problem lösen können. Allerdings habe ich keine Antwort warum das Programm nicht funktioniert. Habe mir selber eine Funktion geschrieben die den 10 Bit AD Wert aus dem ADRESL und ADRESH Register rausliest. Keine Ahnung warum das mit den Funktionen des CCP Compiler nicht funktioniert hat.....
Gespeichert
Steffen
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 1235


Profil anzeigen
« Antworten #3 am: November 27, 2008, 20:54:40 »

Der Simulator im MPLAB hilft sehr. Habe das Problem lösen können. Allerdings habe ich keine Antwort warum das Programm nicht funktioniert. Habe mir selber eine Funktion geschrieben die den 10 Bit AD Wert aus dem ADRESL und ADRESH Register rausliest. Keine Ahnung warum das mit den Funktionen des CCP Compiler nicht funktioniert hat.....

Sollte doch bestimmt CCS heissen oder?

Lass lieber generell die Finger von den CCS Sonderfunktionen. Sie sind ein große Hilfe, wenn sie funktionieren. Das tuen sie aber meist nicht! Jedenfalls nicht auf allen PICs.
Mit dem Schreiben der eigenen Funktionen bist du auf dem richtigen Weg. Vor allem lernst du kennen, wie der PIC wirklich arbeitet und du kannst die Leistungsfähigkeit wesentlich besser nutzen.

Gruß
Steffen
Gespeichert
Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  

Powered by MySQL Powered by PHP Made for Mozilla (Firefox) Made for Internet Explorer
Seite erstellt in 0.032 Sekunden mit 18 Zugriffen.
 
Top! Top!