PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bascom-Programm in C-Programm übersetzen



joho63
23.10.2013, 15:20
Hallo!
Mein Problem ist:
Ich habe ein kleines Programm in Bascom erstellt. Das schaltet einen Mosfet abhängig von einer analogen Eingangsspannung ein, und zwar in einem Fenster von 120mV bis 250mV Dauer Ein, bei mehr oder weniger Spannung für eine Sekunde Ein/Aus.
Der Timer erzeugt 75,2kHz, damit wird der Mosfet geschaltet.

Dieses Programm läuft auf einem Attiny13 tadellos.
Um die Sache noch zu verkleinern, möchte ich einen Attiny 10 verwenden.
Das Programm hat nur 272 Bytes, braucht einen Timer und einen analogen Eingang, der interne Oszillator ist genau genug dafür.

Da der Tiny10 aber von Bascom nicht unterstützt wird, brauche ich das ganze in C (kann ich nicht).

Hier das Programm:

$regfile = "attiny13.dat"
$crystal = 9600000 'intern
$hwstack = 22
$swstack = 24
$framesize = 16

Config Portb.1 = Output ' zum Mosfet
Config Portb.3 = Input ' B.3 = Analog-Eingang
Dim Result As Integer

Config Adc = Single , Prescaler = Auto , Reference = Internal
Do
Result = Getadc(3)
If Result > 120 And Result < 250 Then 'Ein bei 0,12V, Aus bei 0,25V
Gosub Timer_on
Else
Gosub Timer_off
Wait 1 '= Auszeit
Gosub Timer_on
End If
Wait 1 '= Einzeit
Loop
End

Timer_on:
Tccr0a = 66 'hex: 42 Set COM0A1:0 = 0 , 1; Set WGM1:0 = 1 , 0
Ocr0a = 64 'hex:40 Timerstartwert für 75,2kHz
Tccr0b = 9 'hex: 09 Start Timer, Prescaling = 1, WGM02 = 1
Return
Timer_off:
Tccr0a = 2 'hex: 02 COM0A auf 0 gesetzt!
Return

Programmer hab ich (myAVR Smart USB MK3), auch schon anderes mit programmiert, sollte also kein Problem sein.

Die Registerklimmzüge mußte ich machen, weil der Ausgang bei Timer Aus nicht definiert Low Pegel hat.
Ich Bin dankbar für jede Hilfe. Joachim

Wsk8
23.10.2013, 17:20
Hatte gerade etwas Langeweile. Habe aber den Prescaler nicht und eine interne Referenzspannung scheint es beim tiny10 nicht zu geben.
Habe es auch nicht getestet oder sonstige Änderungen vorgenommen, nur 1:1 in C.



/*
*
*/
#include <avr/io.h>
#include <util/delay.h>




void Init(void);
uint8_t Read_Adc(uint8_t channel);
void TimerOn(void);
void TimerOff(void);




int main(void) {
uint8_t ret = 0;

Init();

while(1) {
ret = Read_Adc(3);

if(ret > 120 && ret < 250) {
TimerOn();
} else {
TimerOff();
_delay_ms(1000);

TimerOn();
}
_delay_ms(1000);
}

return 0;
}




void Init(void) {
// PB1 out
DDRB |= (1<<PB3);

// Enable ADC
ADCSRA |= (1<<ADEN);

// Prescaler ?
ADCSRA |= (1<<) | (1<<);

// no internal ref on tiny10
}


uint8_t Read_Adc(uint8_t channel) {
ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
while(ADCSRA & (1<<ADSC)); // auf Abschluss der Konvertierung warten

return ADCL;
}


void TimerOn(void) {
TCCR0A = 0x42;

TCCR0B = 0x09;

OCR0A = 0x40;
}


void TimerOff(void) {
TCCR0A = 0x02;
}


mfg

joho63
23.10.2013, 18:38
Ich danke Dir!
Da muß ich wohl doch noch einiges ändern...
Die Referenz ist nicht kritisch, es wird einfach Vcc benutzt. Aber der Timer im Tiny10 ist 16 Bit, im Tiny13 nur 8 Bit. Einen Prescaler gibt es,
aber nur /8,/64,/256 und /1024. Dafür ist der ADC nur 8 Bit, beim Tiny13 10 Bit. Das ist alles unkritisch, wichtig ist nur die Frequenz
am Ausgang von ca. 75kHz, +/- 2kHz.
Allerdings habe ich jetzt ein Grundgerüst auf dem ich aufbauen kann!
Jetzt muß ich noch einen Compiler suchen, der den Tiny10 kann.

askazo
24.10.2013, 07:36
Jetzt muß ich noch einen Compiler suchen, der den Tiny10 kann.
Da bietet sich wohl das Atmel-Studio an... ;)