Autor Thema: Probleme mit I/O's bei PIC 12F683  (Gelesen 11503 mal)

Offline Ronny

  • Jr. Member
  • **
  • Beiträge: 77
    • Profil anzeigen
Probleme mit I/O's bei PIC 12F683
« am: Dezember 16, 2009, 22:08:21 Nachmittag »
Hallo

Ich habe Probleme mit den I/O's eines PIC12F683. Irgend etwas kann an meiner Konfiguration nicht stimmen. Im Anhang befindet sich ein vereinfachtes Programm mit meinen Einstellungen. Ich habe damit versucht, die einzelnen Ausgänge im Sekundentakt blinken zu lassen. Verwende ich nur den Output "LED" so blinkt diese einwandfrei. Füge ich anschliessend den Output "KALIB" oder "MESSAGE" ein, so wird die LED nur noch kurz angesteuert (ca. 100ms), es erfolgt eine Pause und der 100ms Puls wiederholt sich alle 2s wieder.

Offline Bernd

  • Hero Member
  • *****
  • Beiträge: 3820
    • Profil anzeigen
Re: Probleme mit I/O's bei PIC 12F683
« Antwort #1 am: Dezember 17, 2009, 00:40:56 Vormittag »
AN1 und AN2 sind analoge Eingänge und nach einem POR auch als solche konfiguriert. Du mußt dafür sorgen, daß diese als „digital“ konfiguriert werden (siehe ANSEL-Register, beim CCS gibt es wahrscheinlich etwas in der Form „setup_adc_ports (NO_ANALOGS)“).

Als „analog“ konfigurierte (und digtial ausgewertete) EIngänge werden vom PIC grundsätzlich als „0“ ausgelesen und bewirken wahrscheinlich zusammen mit dem RMW-Problem (siehe Link „Was ist der Vorteil der LAT-Register“ in meiner Signatur) das von Dir beobachtete Verhalten.

Viele Grüße

Bernd
« Letzte Änderung: Dezember 17, 2009, 00:44:14 Vormittag von Bernd »

Offline Ronny

  • Jr. Member
  • **
  • Beiträge: 77
    • Profil anzeigen
Re: Probleme mit I/O's bei PIC 12F683
« Antwort #2 am: Dezember 17, 2009, 21:19:41 Nachmittag »
Hallo Bernd

Mit dem Eintrag setup_adc_ports (NO_ANALOGS) ist ein Teil des Problemes behoben. Fügt man nun den Ausgang KALIB der LED hinzu, so funktioniert die LED nun einwandfrei.

Ich kann aber den Ausgang KALIB immer noch nicht korrekt ausgeben. Sobald die LED angesteuert wird, fällt der Ausgang KALIB auf 0.

Also sobald A4 auf 1 steht, geht A1 auf 0.

Gruss

Ronny

Offline Bernd

  • Hero Member
  • *****
  • Beiträge: 3820
    • Profil anzeigen
Re: Probleme mit I/O's bei PIC 12F683
« Antwort #3 am: Dezember 18, 2009, 00:23:58 Vormittag »
Komparator-Initialisierung? CIN+ (GP0) und CIN- (GP1) sind ebenfalls als analoge Eingänge nach einem POR konfiguriert (CMCON0-Register). Schau Dir mal die CCS Funktion setup_comparator an (mit dem Parameter NC...).

Viele Grüße

Bernd

Offline Ronny

  • Jr. Member
  • **
  • Beiträge: 77
    • Profil anzeigen
Re: Probleme mit I/O's bei PIC 12F683
« Antwort #4 am: Dezember 20, 2009, 22:44:17 Nachmittag »
Hallo Bernd

Also mit diesem Zusatz läuft mein Programm jetzt.
Ich musste allerdings noch eine Änderung vornehmen, die ich mir nicht erklären kann.

Der Ausgang KALIB dient zur Rekalibrierung eines Touch-Sensitive Chips. Dieser ist im Normalfall high und löst bei kurzem low einen Reset aus. Ursprünglich habe ich vor meiner Endlosschleife diesen Ausgang auf high gesetzt, in der Schleife wird dann nach einer gewissen Zeit ein low-->delay-->high ausgelöst. Auf diese Weise blieb der Ausgang beim Start des Programmes auf "LOW". Nun habe ich den Befehl
output_high(KALIB); in die Endlosschleife eingebaut, und so funktioniert alles einwandfrei!

Schönen Abend und Danke für die Lösung meines Problems.

Gruss

Ronny

Offline Ronny

  • Jr. Member
  • **
  • Beiträge: 77
    • Profil anzeigen
Re: Probleme mit I/O's bei PIC 12F683
« Antwort #5 am: Januar 07, 2010, 13:55:54 Nachmittag »
Hallo zusammen

Ich habe immer noch massive Probleme mit dem PIC12F683. Langsam frage ich mich echt, ob dieser Chip irgend einen Defekt hat.

Ich möchte ein sehr simples Programm darauf laufen lassen, welches folgende Teilaufgaben beinhaltet:

1: Dem Chip wird ein Status von einem externen Gerät gegeben. Ist dieser Status=0 so soll eine LED im Halbsekundentakt blinken, ist der Status=1 so bleibt die LED dunkel.

2. Über ein TouchSensitive-IC wird dem PIC ein Befehl erteilt. Steht dieser Befehl 3 Sekunden an, so erhält ein externes Gerät einen einmaligen Impuls.
(Das externe Gerät schaltet so den Status um).

Eigentlich wollte ich dieses Problem mit einer ISR lösen, welche einen Timer hochzählt. Aber diese ISR arbeitet nicht richtig.
Ich habe testmässig die Software umgeschrieben. In der Testsoftware soll der TouchSensitive-Befehl den Status nach 3 Sekunden wechseln (ohne externes Gerät).


///////////////////////////////////////////////////////////////
// Device und Konfiguration ///////////////////////////////////
///////////////////////////////////////////////////////////////

#include <12F683.H>   
#fuses INTRC_IO,NOWDT,NOPROTECT,NOFCMEN,NOIESO,NOPUT,NOBROWNOUT
#use delay(clock=8000000)
#use fast_io (a)


///////////////////////////////////////////////////////////////
// Variablendeklaration ///////////////////////////////////////
///////////////////////////////////////////////////////////////


int Merker1, LED_Timer, Touch_Timer;

#bit MESSAGE_SENT = Merker1.0
#bit LED_STATUS = Merker1.1
#bit Touch_Timer_Reset = Merker1.2
#bit TEST = Merker1.3

///////////////////////////////////////////////////////////////
// E/A-Namen //////////////////////////////////////////////////
///////////////////////////////////////////////////////////////

#define FROM_QUANTUM PIN_A0 // Eingang Ansteuerung von QT310
#define KALIB PIN_A1 // Ausgang zur Kalibrierung
#define TO_SECURITOUCH PIN_A2 // Ausgang zum Hauptbedienteil
#define LED PIN_A4 // Ausgang LED-Anzeige
#define STATUS PIN_A5 // Eingang von Hauptbedienteil

///////////////////////////////////////////////////////////////
// Timer Subroutine ///////////////////////////////////////////
///////////////////////////////////////////////////////////////

#int_ccp1
void ccp1_isr (void){ // Bei Interrupt Timer 1 inkrementieren
++LED_Timer;
++Touch_Timer;
}

///////////////////////////////////////////////////////////////
// Start Hauptprogramm ////////////////////////////////////////
///////////////////////////////////////////////////////////////

void main(void) { // Hauptprogramm

///////////////////////////////////////////////////////////////
// E/A-Definition / CCP-Konfiguration /////////////////////////
///////////////////////////////////////////////////////////////

Setup_Timer_1(T1_INTERNAL | T1_DIV_BY_1); // Interner Takt, 1:1
Setup_CCP1 (CCP_COMPARE_RESET_TIMER);      // Intgerupt Timer reset
ENABLE_INTERRUPTS (GLOBAL);              // Interrupts global aktivieren
ENABLE_INTERRUPTS(INT_CCP1);
CCP_1=5000; // ca.30ms
SETUP_ADC_PORTS(NO_ANALOGS);
setup_comparator(NC_NC_NC_NC);
set_tris_a(0b11101001);

///////////////////////////////////////////////////////////////
// Grundkonfiguration /////////////////////////////////////////
///////////////////////////////////////////////////////////////

Merker1=0;
Touch_Timer=0;
LED_Timer=0;
output_low(LED);
output_low(TO_SECURITOUCH);

output_low(KALIB);
delay_us(5);
output_high(KALIB);
delay_ms(20);

///////////////////////////////////////////////////////////////
// Endlosschleife /////////////////////////////////////////////
///////////////////////////////////////////////////////////////

while (1){ // Hauptschleife

output_high(KALIB);

///////////////////////////////////////////////////////////////
// Status-Anzeige /////////////////////////////////////////////
///////////////////////////////////////////////////////////////

if (TEST==0){
if (LED_STATUS==0){
output_high(LED);
if (LED_Timer>=17){
LED_STATUS=1;
LED_Timer=0;
}
}
if (LED_STATUS==1){
output_low(LED);
if (LED_Timer>=17){
LED_STATUS=0;
LED_Timer=0;
}
}
}

if (TEST==1){
output_low(LED);
LED_STATUS=0;
LED_Timer=0;
}

///////////////////////////////////////////////////////////////
// Verarbeitung TouchSensitive ////////////////////////////////
///////////////////////////////////////////////////////////////

if ((input(FROM_QUANTUM)==0)&(MESSAGE_SENT==0)){

if (Touch_Timer_Reset==0){
Touch_Timer=0;
Touch_Timer_Reset=1;
}

if (Touch_Timer>=100){
if (TEST==0){
TEST=1;
}
else{TEST=0;}
MESSAGE_SENT=1;
}
}

if (input(FROM_QUANTUM)==1){
Touch_Timer_Reset=0;
MESSAGE_SENT=0;
}

} //endwhile
} //endmain

Im Code ist auch der Eintrag "output_high(KALIB);" in der Endlosschleife zu sehen. Wird dieser Eintrag nicht in die Endlose übernommen, nimmt er den Zustand "low" ein ?!?

Im obigen Code sieht man im letzten Befehl den Eintrag "Touch_Timer_Reset=0;".
Wenn ich diesen entferne, so lässt sich der Test-Status umschalten. Ist der Eintrag drin, so bleibt der Test-Status auf 0 und die LED blinkt im Halbsekundentakt. Der TouchSensitive-Eingang hat so keine Wirkung.

Was für mich auch unerklärlich ist, sind die Einstellungen des CCP.
Bei anderen Anwendungen habe ich einen 4MHz Quarz verwendet, den CCP auf 10000 konfiguriert, dies entspicht somit 10ms. Ich konnte in der ISR auf 100 zählen lassen und hatte eine exakte Sekunde.
Bei dieser Anwendung verwende ich den internen Oszi auf 8MHz, stelle den CCP auf 5000 und erhalte ca. 30ms?! Gebe ich dem CCP einen anderen Wert (z.B. 1000) so läuft gar nichts mehr.

Löse ich die Aufgabe mit delays (was die Funktion ziemlich beeinträchtigt, da ich je nach Einstiegspunkt des Befehls bis zu 4 Sekunden warten muss bis der Externbefehl gegeben wird) so funktioniert die Anwendung.

///////////////////////////////////////////////////////////////
// Device und Konfiguration ///////////////////////////////////
///////////////////////////////////////////////////////////////

#include <12F683.H>   
#fuses INTRC_IO,NOWDT,NOPROTECT,NOFCMEN,NOIESO,NOPUT,NOBROWNOUT
#use delay(clock=8000000)
#use fast_io (a)


///////////////////////////////////////////////////////////////
// Variablendeklaration ///////////////////////////////////////
///////////////////////////////////////////////////////////////

int Merker1, Touch_Timer, Recalibration_Timer;

#bit         MESSAGE_SENT = Merker1.0

///////////////////////////////////////////////////////////////
// E/A-Namen //////////////////////////////////////////////////
///////////////////////////////////////////////////////////////

#define FROM_QUANTUM PIN_A0 // Eingang Ansteuerung von QT310
#define KALIB PIN_A1 // Ausgang zur Kalibrierung
#define TO_SECURITOUCH PIN_A2 // Ausgang zum Hauptbedienteil
#define LED PIN_A4 // Ausgang LED-Anzeige
#define STATUS PIN_A5 // Eingang von Hauptbedienteil

///////////////////////////////////////////////////////////////
// Timer Subroutine ///////////////////////////////////////////
///////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////
// Start Hauptprogramm ////////////////////////////////////////
///////////////////////////////////////////////////////////////

void main(void) { // Hauptprogramm

///////////////////////////////////////////////////////////////
// E/A-Definition /////////////////////////////////////////////
///////////////////////////////////////////////////////////////

SETUP_ADC_PORTS(NO_ANALOGS);
setup_comparator(NC_NC_NC_NC);
set_tris_a(0b11101001);

///////////////////////////////////////////////////////////////
// Grundkonfiguration /////////////////////////////////////////
///////////////////////////////////////////////////////////////

Merker1=0;
Recalibration_Timer=0;
Touch_Timer=0;
output_low(LED);
output_low(TO_SECURITOUCH);

while (1){ // Hauptschleife

output_high(KALIB);


delay_ms(500);

output_low(LED);

delay_ms(500);

if ((input(FROM_QUANTUM)==0)&(MESSAGE_SENT==0)){
++Touch_Timer;
if (Touch_Timer>=3){
Touch_Timer=0;
output_high(TO_SECURITOUCH);
delay_ms(200);
output_low(TO_SECURITOUCH);
MESSAGE_SENT=1;
}
}

if (input(STATUS)==0){
output_high(LED);
}

if ((input(FROM_QUANTUM)==1)&(MESSAGE_SENT==1)){
MESSAGE_SENT=0;
}

if (input(FROM_QUANTUM)==1){
Touch_Timer=0;
}

++Recalibration_Timer;

if (Recalibration_Timer>=180){
output_low(KALIB);
delay_us(5);
output_high(KALIB);
delay_ms(20);
Recalibration_Timer=0;
}


} //endwhile
} //endmain

Danke für die Antworten

Gruss

Ronny

Offline Ronny

  • Jr. Member
  • **
  • Beiträge: 77
    • Profil anzeigen
Re: Probleme mit I/O's bei PIC 12F683
« Antwort #6 am: Januar 12, 2010, 11:31:11 Vormittag »
 :(

Hat wirklich keiner einen Lösungsansatz zu meinem Problem?


slowslow

  • Gast
Re: Probleme mit I/O's bei PIC 12F683
« Antwort #7 am: Januar 12, 2010, 12:07:09 Nachmittag »
du hast zwar ne menge geschrieben ne menge code gepostet, mir ist aber nicht klar geworden, was im einzelnen nicht geht. irgendwie geht alles nicht.

Offline Ronny

  • Jr. Member
  • **
  • Beiträge: 77
    • Profil anzeigen
Re: Probleme mit I/O's bei PIC 12F683
« Antwort #8 am: Januar 12, 2010, 13:40:14 Nachmittag »
Hallo

Also ich versuche es nochmals zu erklären:

Das Programm im zweiten Code-Fenster läuft einwandfrei.
Da aber die ganze Zählerei und der Blinktakt über die Delays gelöst ist, dauerts von der Berührung des TouchPads (FROM_QUANTUM) bis zur Auslösung (TO_SECURITOUCH) unterschiedlich lange, je nachdem zu welchem Zeitpunkt man die Fläche berührt. (zwischen 3 und 4 Sekunden).

Um dieses Problem zu umgehen, wollte ich die Zeiten über eine ISR generieren. Dies ist im ersten Code-Fenster zu sehen. Bei diesem Code-Beispiel ist es so, dass nur der Blinktakt der LED funktioniert. Die Umschaltung der Variable "TEST" funktioniert aber nicht, obwohl dieselbe ISR dazu verwendet wird.

Gruss

Ronny

slowslow

  • Gast
Re: Probleme mit I/O's bei PIC 12F683
« Antwort #9 am: Januar 12, 2010, 17:12:31 Nachmittag »
Was macht denn die Software, wenn gilt :

input(FROM_QUANTUM)==0
und gleichzeitig
MESSAGE_SENT==1

da klemmt doch was ? oder blick ich deinen code nicht so richtig?

Offline Ronny

  • Jr. Member
  • **
  • Beiträge: 77
    • Profil anzeigen
Re: Probleme mit I/O's bei PIC 12F683
« Antwort #10 am: Januar 12, 2010, 20:30:46 Nachmittag »
Dann darf die Software nichts machen. Das ist die Detektion der positiven Flanke.
Für einen weiteren Befehl muss die Hand zuerst von der Touchfläche entfernt werden.
Der Quantum Chip arbeitet mit activeLow.

Offline Ronny

  • Jr. Member
  • **
  • Beiträge: 77
    • Profil anzeigen
Re: Probleme mit I/O's bei PIC 12F683
« Antwort #11 am: Januar 25, 2010, 15:56:27 Nachmittag »
 :-\
Hallo

Ich komme einfach auf keinen grünen Zweig und muss deshalb nochmals nachhaken. Falls wirklich keiner einen Lösungsansatz für mich hat, muss ich mir wohl nochmals einen neuen PIC bestellen.

Danke für die Antworten

Ronny


Fritz

  • Gast
Re: Probleme mit I/O's bei PIC 12F683
« Antwort #12 am: März 10, 2010, 22:23:28 Nachmittag »
Hmm,
wenn Du den CCS Compiler benutzt hast Du doch schöne Routinen
für das RTOS (Real Time operating System) mit eingebaut ?
Benutze doch einfach mal RTOS und reduziere und gliedere Deine Routinen
auf das Wesentliche. Mit Semaphoren kannst Du die Abhängigkeit zw. den
Routinen steuern und mit den Interrupts (z.Bsp, der Eingänge und Timer)
kann man schön diese dann triggern.
Da wird alles übersichtlicher und man blickt schneller evtl. Fehler.
Mein rat : Redesign mit RTOS.

Offline Ronny

  • Jr. Member
  • **
  • Beiträge: 77
    • Profil anzeigen
Re: Probleme mit I/O's bei PIC 12F683
« Antwort #13 am: März 12, 2010, 13:56:37 Nachmittag »
Hallo

Ich habe noch nie von diesem RTOS gehört. Aber auf der CCS-Seite wird erwähnt, dass diese Funktion nur mit PCW or PCWH implementiert werden kann. Die habe ich leider nicht.

Gruss

Ronny

 


* Recent Topics