So, das Board geht erst mal, waren nur kleine Verbindungsdenkfehler mit fataler Wirkung
Naja, also den Code hab ich auch gerade ausgebessert und lade ihn jetzt auf den Chip.
Fehlercode scheint auf:
""
brennen ...
benutze: mySmartUSB MK2 an com3 mit ATtiny13
USB-Treiber installiert, aktiv (V 5.4.24.0), Port: com3
Prozessor: ATtiny13
schreibe 2968 Bytes in Flash-Memory ...
Fehler: beim Überprüfen der geschriebenen Daten.
Erste Abweichung bei Byte 0 , "0x09" != "0x01"
""
Dann poste ich noch mal den korrigierten Code:
Code:
#define F_CPU 3686400 // Taktfrequenz des myAVR-Boards
#include <avr\io.h> // AVR Register und Konstantendefinitionen
#include <inttypes.h>
//----------------------------------------------------------------------
uint16_t readADC(uint8_t channel)
{
// Funktion 1 zum Auslesen der Spannung
uint8_t i; // Variablen definieren (Zählervariable i + Resultat)
uint16_t result = 0;
ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1); //ADEN = ADC Enable
// wenn adps1+2 on sind und adps0 off, dann ist der Teilungsfaktor 64 (Tabelle Datasheet)
ADMUX = channel; //Kanal wählen; REFs0+1 -> interne Referenz 2,56V verwenden, REFS1 gibt es bei Attiny13 nicht
//externen Kondensator mit 100nF (Aufdruck 104) an AREF auf Masse
//Dummy-Readout (unten), misst 1* Ergebnis, wird nicht gespeichert
ADCSRA = ADCSRA | (1<<ADSC); // Schaltet bei ADCSRA das ADSC-Bit ein, d.h. Messung starten
while(ADCSRA & (1<<ADSC)); //Warte bis Messvorgang vorbei ist
// Nun 3* Spannung auslesen, Durchschnittswert ausrechnen
for (i=0; i<3; i++)
{
// Schleife, startet 3*
ADCSRA = ADCSRA |(1<<ADSC); // Einmal messen
while(ADCSRA & (1<<ADSC)); //Warte bis Messung vorbei
result = result + ADCW; // Resultate zusammenzählen (R1+R2+R3) -> später alles /3
}
ADCSRA = ADCSRA & (~(1<<ADEN)); //ADC wieder deaktivieren
result=result/3; // Durchschnittswert
return result;
}
int main (void) // Hauptprogramm, startet bei Power ON und Reset
{
float spannung; //Definiere Variable
DDRB=0b00001111;
while (true)
{
uint16_t result = readADC(0); // ruft die ADC Funktion auf an Pin0 =ADC0
(float) (result);
spannung=0.003086*result;
waitMs(400);
if ((spannung > 1.5) && (spannung < 1.7))
{
PORTB=PORTB|(1<<PB1);
waitMs(600);
PORTB=PORTB&(~(1<<PB1));
}
if ((spannung>1)&& (spannung<1.1))
{
PORTB=PORTB|(1<<PB2);
waitMs(600);
PORTB=PORTB&(~(1<<PB2));
}
else
{
PORTB=PORTB|(1<<PB1)|(1<<PB2);
waitMs(600);
PORTB=PORTB&(~(1<<PB1))&(~(1<<PB2));
}
}
return 0;
}
Beide Schreibweisen funktionieren, jedoch ist letzteres besser, da es kürzer und übersichtlicher ist.
Naja, der Verständlichkeit gegenüber Anfängern halber bevorzuge ich a=a|... statt a|=a denn zu Anfang konnte ich mir |= nicht erklären und fand es auch nirgendwo im Internet... als ich las, das ist das selbe wie =...|... war alles sofort klar!
Lesezeichen