Forum: Mikrocontroller und Digitale Elektronik ADC Pin am PIC16F1936 richtig über Interrupt einlesen


von D a v i d K. (oekel) Benutzerseite


Lesenswert?

Hi,

ich hoffe das wird mein letzter Beitrag zu diesem Chip ;)
(Dank eurer Hilfe hat alles andere bestens funktioniert)

Es bleibt nur noch Pin Nr 3 (RA1) aus meinem Layout übrig, für welchen 
ich noch keinen Code erzeugen konnte, der mich weiter Bringt.
Hier noch Mal das Layout aus meinem ersten Post:
http://www.mikrocontroller.net/attachment/171491/schematic_test.png

Wie man sieht, ist an diesem Pin entweder das MIC oder das Poti 
angeschlossen.
Ziel soll es sein, im Falle des zugeschalteten MICs einen Takt zu 
generieren und im Falle des zugeschalteten Potis ein Value darus zu 
generieren.

Nun bin ich mir immer noch nicht sicher, was laut Layout an diesem Pin 
anliegt!

Daher habe ich mich zuerst daran gemacht den Pin RA1 als AN1 (analog) zu 
konfigurieren und auf den Interrupt des ADCs zu warten, in der Hoffnung, 
dass dieser nur anspringt sobald das MIC einen entsprechenden Pegel 
erreicht.

Doch der ADC gibt mir bei jeder Auswertung entweder 0 oder 1023 (max) 
aus.
Für den Taktgeber wäre es ausreichend, doch in verbindung mit dem Poti 
würde ich gerne etwas differenziertere Werte erhalten.

Hier der abgespeckte Code:
1
void init_ADC(void)
2
{
3
    ANSELAbits.ANSA1 = 1; //SPEED
4
    TRISA1 = 1; //SPEED
5
6
    ADCON0bits.ADON = 0;
7
    ADCON0bits.CHS = 0b00001; //AN1
8
    ADCON1bits.ADFM = 1; //Right justified. Six Most Significant bits of ADRESH are set to ?0?
9
    ADCON1bits.ADCS = 0b001; //FOSC/8 bei 8000000Hz
10
    ADCON1bits.ADNREF = 0;
11
    ADCON1bits.ADPREF = 0b00;
12
    ADCON0bits.ADON = 1;
13
    PIE1bits.ADIE = 1;
14
    // ADCON0bits.GO_nDONE = 1;
15
}
16
17
18
void interrupt ISR()
19
{
20
    if (ADIE && ADIF)
21
    {//AN1 als Analog-Input Konfiguriert
22
        uint16_t analog = ((uint16_t) ADRESH) << 8;
23
        analog |= ADRESL;
24
        if(analog > 1000)//---BREAKPOINT--->analog=0 | analog =1023??
25
            next_fixColor(3,0);
26
        ADIF = 0;
27
    }
28
}

Der Aufruf im laufenden Code lautet dann regelmäßig:
1
....
2
if(DmxRxField[4]>150 && !GO_nDONE)
3
     ADCON0bits.GO_nDONE = 1;//next_fixColor_delay über ADC
4
...

http://www.mouser. com/ds/2/268/41364A-75942.pdf
(Kapitel 11)

Grüße Oekel

PS:Vollständigen Code unterscheidet sich nur durch diverse 
Erweiterungen, die zur Zeit des Aufrufes von GO_nDONE nicht aktiv sind.
Was mache ich falsch?

: Verschoben durch Moderator
von Chris B. (dekatz)


Lesenswert?

D a v i d K. schrieb:
> Doch der ADC gibt mir bei jeder Auswertung entweder 0 oder 1023 (max)
>
> aus.

Was liefert den ein 4093 (NAND-Schmitt-Trigger) für ein Ausgangssignal?
Ich tippe auf ein Digitales!
Könnte der Grund sein, das der AD immer nur 0 oder 1023 liefert ;-)

von D a v i d K. (oekel) Benutzerseite


Lesenswert?

Ok, sollte ich mich da tatsächlich der letzte PIN davon abhalten den 
originalen Chip durch meine Variante zu ersetzen?

Digital hieße für mich, dass ich etwas wie ein INTERRUPT-ON-CHANGE an 
diesem Pin benötige. Beim PIC16F1936 ist so etwas jedoch nur am PORTB 
verfügbar.

Habt ihr einen Vorschlag für mich, wie ich nun den Wert des Potis über 
den 4093 (NAND-Schmitt-Trigger) auslesen kann?
Wie kann überhaußt aus den Analogen via NAND ein Digitales werden? 
(Verstehe nicht, wo an einem NAND so etwas wie ein Abtastung mit einem 
Vergleichswert geschiet.

Also entweder ist es am PIN Binär oder eine Serielle Folge von Binären 
Bits (was wiederum nicht logisch klingt für diesen Baustein).

Grüße Oekel

von D a v i d K. (oekel) Benutzerseite


Lesenswert?

Oder wird der das NAND-Gatter hier als Oszillator betrieben?
Ich erkenne jedoch keine Gemeinsamkeiten mit mir bekannten 
Oszillator-Schaltungen für den 4093.

Welche Möglichkeiten hätte ich denn dieses Rechtecksignal zu 
entschlüsseln, da mir ja kein INTERRUPT-ON-CHANGE für diesen PIN zur 
Verfügung steht.

Grüße Oekel

von Chris B. (dekatz)


Lesenswert?

(Hmmmm vielleicht hätte ich bei den Fragen in meiner Antwort hinzufügen 
sollen, dass es ironisch gemeint war.)

Wie kommst du jetzt auf "Interrupt-on-change" wo du in deinem Programm 
versuchst ein ANALOG-Signal einzulesen.

Der C10 mit Poti und den 4093 ist offensichtlich ein Oszillator und der 
liefert Rechtecksignale und da ergibt die AD-Wandlung nun mal immer nur 
ca.0 und ca.1023. Das gilt auch für das Mikrofonsignal.

Wenn du "Interrupt-on-change" benötigst (was nur am PORTB geht), legst 
du eben 1 DIP-Schalter Anschluß auf einen der freien PORTC-Pins.

von D a v i d K. (oekel) Benutzerseite


Lesenswert?

Chris B. schrieb:
> Wenn du "Interrupt-on-change" benötigst (was nur am PORTB geht), legst
> du eben 1 DIP-Schalter Anschluß auf einen der freien PORTC-Pins.

Das Projekt ist soll ein "Tausche den Chip und sei glücklich" bleiben.
Sprich der original Scheinwerfer + leerer PIC soll gekauft werden und 
dann möchte ich nur noch allen Interessiereten (vorwiegeng Kollegen von 
mir) den PIC Flashen und in die Hand drücken können.

Außerdem soll das Teil im Falle eines Defektes jederzeit auf den 
originalen Chip rückrüstbar sein. Man könnte natürlich PIN A1 mit einem 
anderen Cx direkt am CHip verbinden. Doch davon möchte ich Abstand 
nehmen, denn löten direkt an der MPU halte ich für sehr riskant.

Aktuell probiere ich es über Timer4:
1
else if (TMR4IE && TMR4IF)
2
    {
3
        if(PORTAbits.RA1 != oscillator_lBit)
4
        {
5
            oscillator_lBit ^=1;
6
            oscillator_freq[oscillator_freq_index] = oscillator_counter;
7
            oscillator_freq_index = (oscillator_freq_index+1)%10;
8
            if(oscillator_freq_index ==9)
9
                PIE3bits.TMR4IE = 0;
10
            oscillator_counter = 0;
11
        }
12
        oscillator_counter++;
13
           
14
        TMR4IF = 0;
15
    }
und nehme dann den Mittelwert, da alle 7-8 Werte ein Ausreißer dabei 
ist.
(Kann natürlich daran liegen, dass ich debugge und nach dem BREAK sich 
der Takt erst wieder einschwingen muss!?!?



Grüße Oekel

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.