Köksfläkt, kontrollpanel
Köksfläkt, kontrollpanel
Någon här som vet eller kan lista ut, hur mikrokontrollern läser av knapparna och tänder LEDarna på panelen?
I/O är kopplade enligt schema:
Dvs. in och utdata är kopplade på samma pin i flatkabeln. Växlas in och ut på samma pin i MCU, eller är pull-up och shuntmotstånd kopplade på något sinnrikt sätt?
//Andreas
I/O är kopplade enligt schema:
Dvs. in och utdata är kopplade på samma pin i flatkabeln. Växlas in och ut på samma pin i MCU, eller är pull-up och shuntmotstånd kopplade på något sinnrikt sätt?
//Andreas
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: Köksfläkt, kontrollpanel
Inte rätt kort, utan ett Thermex, men jag tänker att de är likartade.
Kontakten till flatkabeln är omgärdad av 100, 470 och 1k motstånd.
Kontakten till flatkabeln är omgärdad av 100, 470 och 1k motstånd.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: Köksfläkt, kontrollpanel
processorn skickar på en etta på en i taget av de fem ledarna som går både till knappar och LED. Samtidigt skickar den ut en nolla på den som är gemensam för alla LED om motsvarande LED ska lysa, och så läser den av om det kommer en etta på den som är gemensam för alla knapparna.
Om du ska använda panelen till egen mikrokontroller så behöver du pull-down-motstånd på den som är gemensam för alla knapparna, i övrigt behöver du sex utportar och en inport.
Om du ska använda panelen till egen mikrokontroller så behöver du pull-down-motstånd på den som är gemensam för alla knapparna, i övrigt behöver du sex utportar och en inport.
Re: Köksfläkt, kontrollpanel
Får jag då att LEDarna lyser max 20% av tiden, och att knapparna läses en efter en?
Re: Köksfläkt, kontrollpanel
Ja, och om du driver dem med 5x "normal" ström så får du tillbaka 100% ljusstyrka.
Faran med detta är att mjukvarufel kan steka LED, ifall dessa 5x är mer än vad de tål. Rekommenderar att du först kör med en strömstyrka som de tål kontinuerligt, och senare när koden är klar eventuellt ökar strömstyrkan. Det kan också tänkas att de lyser starkt nog även om du håller dig inom max kontinuerligt specad ström som din toppström.
Faran med detta är att mjukvarufel kan steka LED, ifall dessa 5x är mer än vad de tål. Rekommenderar att du först kör med en strömstyrka som de tål kontinuerligt, och senare när koden är klar eventuellt ökar strömstyrkan. Det kan också tänkas att de lyser starkt nog även om du håller dig inom max kontinuerligt specad ström som din toppström.
Re: Köksfläkt, kontrollpanel
Jag har naturligtvis ingen aning om strömspecen, men de lyser röda och klara på 0,5 mA. Jag antar att jag utgår därifrån och växlar upp vid behov.
Re: Köksfläkt, kontrollpanel
Varsågod!
En tumregel för hur mycket ström de tål är att kolla datablad för snarlika LED med ungefär samma fysiska mått.
Vet inte vad små ytmonterade LED tål, men tumregeln för klassiska gamla hålmonterade är att cirka alla tål 20mA.
Om 0.5mA gör att de lyser starkt nog så kan du säkert köra 2,5mA för att kunna växla mellan att driva en i taget av alla fem, utan risk att steka nån LED ifall programmet kraschar så att 2,5mA ligger på hela tiden.
Just ja, i princip så kan du också scanna allt så att du först slår på alla LED som ska lysa, och också läser av knapp-ingången, sen slår du av LED-drivningen och slår på återstående av de fem gemensamma signalerna, och läser av knapp-ingången igen. På så sätt kan du tända önskade LED och också avgöra om någon knapp är intryckt med endast två "cykler" istället för fel, men om någon knapp är intryckt så får du såklart scanna alla fem kombinationerna.
-----------
Jag slog på hjärnan lite mer:
En till variant som kanske är den effektivaste vore att aktivera "gemensam för LED" och utgångar för önskade LED, och efter en stund stänga av dessa, växla de fem som delas mellan LED och knappar till att istället vara ingångar, och sätta den som är gemensam för knapparna till utgång, och läsa av de som just satts till ingångar. Då blir det bara två cykler för drivning/avläsning, och du kan också lämna det i "drivning"-läget och bara då och då korta ögonblick växla till att läsa av knapparna. Fördelen med detta är att knapparna kan du t.ex. läsa i valfri loop där du vill veta deras tillstånd, eller i någon interruptkod, men merparten av tiden så drivs LED. Då kan du köra de motstånd för 0,5mA du redan har, eftersom avläsningen av knapparna kommer nog ta nära försumbar tid.
En tumregel för hur mycket ström de tål är att kolla datablad för snarlika LED med ungefär samma fysiska mått.
Vet inte vad små ytmonterade LED tål, men tumregeln för klassiska gamla hålmonterade är att cirka alla tål 20mA.
Om 0.5mA gör att de lyser starkt nog så kan du säkert köra 2,5mA för att kunna växla mellan att driva en i taget av alla fem, utan risk att steka nån LED ifall programmet kraschar så att 2,5mA ligger på hela tiden.
Just ja, i princip så kan du också scanna allt så att du först slår på alla LED som ska lysa, och också läser av knapp-ingången, sen slår du av LED-drivningen och slår på återstående av de fem gemensamma signalerna, och läser av knapp-ingången igen. På så sätt kan du tända önskade LED och också avgöra om någon knapp är intryckt med endast två "cykler" istället för fel, men om någon knapp är intryckt så får du såklart scanna alla fem kombinationerna.
-----------
Jag slog på hjärnan lite mer:
En till variant som kanske är den effektivaste vore att aktivera "gemensam för LED" och utgångar för önskade LED, och efter en stund stänga av dessa, växla de fem som delas mellan LED och knappar till att istället vara ingångar, och sätta den som är gemensam för knapparna till utgång, och läsa av de som just satts till ingångar. Då blir det bara två cykler för drivning/avläsning, och du kan också lämna det i "drivning"-läget och bara då och då korta ögonblick växla till att läsa av knapparna. Fördelen med detta är att knapparna kan du t.ex. läsa i valfri loop där du vill veta deras tillstånd, eller i någon interruptkod, men merparten av tiden så drivs LED. Då kan du köra de motstånd för 0,5mA du redan har, eftersom avläsningen av knapparna kommer nog ta nära försumbar tid.
Re: Köksfläkt, kontrollpanel
Den andra panelen är likartad, men med fler dioder.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: Köksfläkt, kontrollpanel
Detta borde väl funka. Gemensam LED sätts som DO 0V och varje LED drivs av varsin DO om 0,5 mA via shuntar om vardera 3.3kOhm.
När knappar läses, sätts LED common till 3,3 volt. Pull up på 100 kOhm.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: Köksfläkt, kontrollpanel
Jag skulle nog kombinerat dessa D0 och D1 och satt separata mikrokontrollerportar till de ledare som är gemensamma för alla LED eller alla knappar inom en panel.
Om du driver 0,5mA per LED så behöver du troligtvis ingen separat drivare - portarna tål säkert 5*0,5=2,5mA.
En till detalj: Eftersom man kan trycka in flera knappar samtidigt så är det bra om du inte sätter utportar till ett eller noll, utan växlar mellan att sätta dem till utport, etta och sätta dem till inportar. Om du sätter några till utportar etta och några till utportar nolla (för att tända vissa lysdioder) och nån trycker in flera knappar samtidigt så kommer dessa ettor och nollor att kortslutas mot varandra. Vet inte vad portarna tål, de kanske överlever, men det är "bad practice" att göra så.
Om du driver 0,5mA per LED så behöver du troligtvis ingen separat drivare - portarna tål säkert 5*0,5=2,5mA.
En till detalj: Eftersom man kan trycka in flera knappar samtidigt så är det bra om du inte sätter utportar till ett eller noll, utan växlar mellan att sätta dem till utport, etta och sätta dem till inportar. Om du sätter några till utportar etta och några till utportar nolla (för att tända vissa lysdioder) och nån trycker in flera knappar samtidigt så kommer dessa ettor och nollor att kortslutas mot varandra. Vet inte vad portarna tål, de kanske överlever, men det är "bad practice" att göra så.
Re: Köksfläkt, kontrollpanel
Menar du så här?
Jag tänkte koppla direkt till en MCU. Jag har några PIC18F13K50 liggandes och där skall finnas 20 mA in och ut.
Jag tänkte koppla direkt till en MCU. Jag har några PIC18F13K50 liggandes och där skall finnas 20 mA in och ut.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: Köksfläkt, kontrollpanel
Såhär, ungefär:
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: Köksfläkt, kontrollpanel
Nu börjar det likna något.
Kod: Markera allt
/* PIC18F3K50
-|VDD VSS|-
-|RA5 RA0|-
AI dp -|RA4/AN3 RA1|-
-|RA3 Vusb|-
PWM output -|RC5/P1A RC0|- Light output
6 Jet|Jet -|RC4 RC1|- _ |Alm 1
5 123| 2 -|RC3 RC2|- 0/1| 1 4
7 Tmr|Tmr -|RC6 RB4|- Common Button 10
8 Lit| 3 -|RC7 RB5|-
-|RB7 RB6|- Common LED 9
Button press time out to rest = 240 min TMR0
Eftergångstid time out = 15 min TMR0
Jet time out = 10 min TMR0
PWM TMR2
Pressure sensor AN4
WRITE: RB4 = floating | TRISB.B4 = 1, ANSELH.RB2 = 0
RB6 = 0 V | TRISB.B6 = 0, LATB.B6 = 0
READ: RB4 = 0 V | TRISB.B4 = 0, LATB.B4 = 0
RB6 = 5 V | TRISB.B6 = 0, LATB.B6 = 1
*/
char tictoc = 0;
void interrupt(){
TMR0H = 0x0B;
TMR0L = 0xE0; // Räknar till 62496 härifrån ==> 15,6 ms, 64 Hz
tictoc = 1;
INTCON.TMR0IF = 0;
}
void main(){
char hood_input, hood_01 = 0, hood_123 = 0, hood_Jet = 0,
hood_Tmr = 0, hood_Lit = 0, hood_out = 0, status_h = 0, status_l = 0,
pressure;
//status_l ||||||JET|32|31|
//status_h ||||||Alm|Tmr|Lit|
int timer_Jet, timer_Tmr;
long timer_rest = 0;
OSCCON = 0b01110000;
OSCCON2 = 0x00;
T0CON = 0b10001000;
LATB = 0x00;
LATC = 0x00;
ANSEL = 0b00001111;// D ANS7, D ANS6, A ANS5, A ANS4, A ANS3
ANSELH = 0b11111000;// A ANS11, D ANS10, D ANS9, D ANS8
TRISA = 0b11111111;
TRISB = 0b10111111;
TRISC = 0b00010000;
PWM1_Init(40000);
PWM1_Set_Duty(0);
PWM1_Start();
//ADC_Init();
INTCON = 0b10100000;
hood_out = 0x00;
while(1){
if (tictoc){
tictoc = 0;
TRISB.B4 = 0;
LATB.B6 = 1;
TRISC = 0b11011100;
delay_us(100); //may ned a few us to settle from being output.
hood_input = PORTC;
TRISC = 0;
LATB.B6 = 0;
TRISB.B4 = 1;
//pressure = ADC_Get_Sample(3);
hood_01 <<= 1;
hood_01.B0 = ~hood_input.B2;
hood_123 <<= 1;
hood_123.B0 = ~hood_input.B3;
hood_Jet <<= 1;
hood_Jet.B0 = ~hood_input.B4;
hood_Tmr <<= 1;
hood_Tmr.B0 = ~hood_input.B6;
hood_Lit <<= 1;
hood_Lit.B0 = ~hood_input.B7;
if (hood_01 == 1){
timer_rest = 691200; // = 3 * 3600 * 60
switch(status_l){
case 0:
status_l = 0x01;
break;
default:
status_l = 0x00;
status_h &= 0x01;
break;
}
}
else if (hood_123 == 1){
timer_rest = 691200; // = 3 * 3600 * 60
switch(status_l){
case 1:
status_l = 2;
break;
case 2:
status_l = 3;
break;
case 3:
status_l = 1;
break;
default:
break;
}
}
else if (hood_Jet == 1){ //start or shut off jet
timer_rest = 691200; // = 3 * 3600 * 60
switch(status_l){
case 0:
break;
case 1:
status_l += 0b00000100;
timer_Jet = 38400;
break;
case 2:
status_l += 0b00000100;
timer_Jet = 38400;
break;
case 3:
status_l += 0b00000100;
timer_Jet = 38400;
break;
default:
status_l -= 0b00000100;
break;
}
}
else if (hood_Tmr == 1){
timer_rest = 691200; // = 3 * 3600 * 60
switch(status_l){
case 0:
break;
default:
timer_Tmr = 57600; //57600
status_h ^= 0b00000010;
break;
}
}
else if (hood_Lit == 1){
timer_rest = 691200; // = 3 * 3600 * 60
status_h ^= 0b00000001;
}
if(timer_rest == 0){
status_l = 0; // go to rest if no button pressed for the last 4 hours
status_h = 0;
}
else{
timer_rest--;
}
if((status_l & 0b00000100) && (timer_Jet == 0)){
status_l -= 0b00000100;
}
else{
timer_Jet--;
}
if((status_h & 0b00000010) && (timer_Tmr == 0)){
status_h -= 0b00000010;
status_l = 0;
}
else{
timer_Tmr--;
}
switch(status_l){
case 1:
PWM1_Set_Duty(63);
hood_out = 0b00000100;
break;
case 2:
PWM1_Set_Duty(95);
hood_out = 0b00001100;
break;
case 3:
PWM1_Set_Duty(127);
hood_out = 0b10001100;
break;
case 5:
PWM1_Set_Duty(255);
hood_out = 0b00010100;
break;
case 6:
PWM1_Set_Duty(255);
hood_out = 0b00011100;
break;
case 7:
PWM1_Set_Duty(255);
hood_out = 0b10011100;
break;
default:
PWM1_Set_Duty(0);
hood_out = 0;
break;
}
switch(status_h){
case 1:
hood_out ^= 0b00000001; //3|Tmr|_|Jet|2|1|Alm|Lit //status_h ||||||Alm|Tmr|Lit|
break;
case 2:
hood_out ^= 0b01000000;
break;
case 3:
hood_out ^= 0b01000001;
break;
default:
break;
}
LATC = hood_out;
}
}
}Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
