Wieder mal ein Neuer (nicht der Manuel)

weimoe01

Neues Mitglied
06. Juli 2014
11
0
0
65
Lemgo/OWL/NRW
Sprachen
Hallo zusammen

Ich bin der Thomas, oder vom Nachnamen abgeleitet, der Moe.
Geboren 1958 in Berlin, seit ca 2000 in NRW ansässig, zuerst in Detmold und nun seit 7 Jahren in Lemgo wohnhaft.
Ich bin gelernter Elektroniker und habe bis 1988 in der Elektronikentwicklung in der Ex-DDR als Labormechaniker gearbeitet.
Hab mich damals beruflich und privat mit der 8-Bit-Prozesseortechnik mit dem U8080 und den Peripheriebausteinen (DMA, CTC, Pio usw.) in der Prozessautomatisierung und in der Konsumgüterelektronik beschäftigt.
Das war damals alles sehr Hardwarenah. Unser Glanzstück war damals ein ZX-Spektrum-Nachbau mit verfügbaren DDR-Bauelementen.
Erfahrungen mit Maschinencode und Basic sind aus dieser Zeit sicher noch da, wenn auch sicher mühsam wieder zu beleben.
Nach Jahren beruflicher Umorientierung und zu wenig Platz, Geld und Zeit für die Elektronik bin ich jetzt in der "vertikalen Transportbranche", also im Aufzugsbau als Servicetechniker tätig und habe nun mein altes Hobby, die Elektronik, wiederbelebt.

Soviel zur Historie. Nun sitze ich vor einem STK-500-Board mit dem AVR Studio 6 auf dem Laptop und eine Verbindung besteht. Das Testprogramm mit dem mitgelieferten Atmega8515 läuft auch. Ich habe jetz auch schon einige Stunden Suche bei Go...le und im Forum durch, scheitere aber immer an meinen nicht ausreichenden Englischkentnissen, da fast alle weiterführenden Hinweise und Infos auf englichsprachige Seiten und Foren leiten.
Auch der Start mit dem AVR-Studio scheint aus diesem Grund für mich fast aussichtslos.

Zum Verständnis der grundlegenden Bedienung würde ich es gerne schaffen, etwas Code zu generieren und auf einen Controller zu bringen, damit ein Tastendruck eine LED synchron oder mit zeitlichem Versatz zum leuchten oder verlöschen bringt.

Ich muß aber hier gleich anfügen, daß meine Reaktion auf Tips oder Links von Euch aus beruflichen Gründen manchmal etwas verzögert kommen kann. Ich hoffe trotzdem auf ein paar "Eingebungen" und möchte mich im Voraus für Euer Verständnis und Eure Hilfe bedanken.
 
Keine Panik

Hallo

Hier ein kleiner Nachtrag.
Ich bin gerade dabei, ein Youtube-Video zu schauen und nachzuvollziehen, welches sich mit dem Studio6 ( heißt ja jetzt Atmel- und nicht mehr AVR-Studio. Wer lesen kann, ist wieder mal klar im Vorteil!) und dem Programmieranfang beschäftigt. Eventuell stellt sich ja ein Anfangserfolg ein.

Wer trotzdem mit mir in Kontakt treten möchte, Gerne!.

Danke und schönen Sonntag.
 
Hallo Thomas, und erstmal herzlich willkommen hier im Forum!

Das mit den mangelnden Englischkenntnissen ist natürlich ein ... Problem, da nahezu alle Datenblätter usw auf Englisch sind. Aber Du wirst das trotzdem schaffen. Hast ja bereits Hintergrundwissen...

Du schreibst, Du hast das Studio und das STK am Laptop: über RS232, oder einen USB-TTL-Wandler, oder wie?
Welche Sprache soll es denn werden? Klingt ja nach Assembler, aber das Studio kann ja inzwischen auch C.

Normalerweise würde ich Dir das neueste komplette Datenblatt des Mega8515 und das AVR Instruction Set empfehlen - vielleicht versuchst Du Dich trotzdem daran?

Hilfreich für den ASM-Anfang finde ich dieses Tutorial (auf deutsch - links das PDF zum drucken).

Als erste Aufgabe könntest Du zB einen PORT mit den Tastern, und einen mit den LEDs verbinden, und im ersten Versuch die LEDs dauerhaft anschalten.
Im 2ten Versuch kontinuierlich den Taster-Zustand auf die LEDs spiegeln.
Im 3ten die LEDs bei Tastendruck binär rauf-/runterzählen.
Im 4ten eine LED bei Tastendruck nach links/recht laufen lassen.

Nach etwas Einarbeitung in Interrupts und interne Hardware könntest Du einen Timer dazu verwenden, die LED/LEDs blinken zu lassen, zu dimmen, 'n Lauflicht usw.

Mit dem UART könnte man vom PC her Bytes an den Mega übertragen, der die dann als Bitmuster darstellt.
Oder als Vorgabe fürs Blinken/Dimmen usw.
Oder man überträgt 'ne Rechenaufgabe, die der Mega ausrechnet und das Ergebnis binär darstellt und/oder an den PC zurücküberträgt.
Hmm... der Mega8515 scheint keinen internen ADC zu besitzen - damit kann man also nicht "rumspielen". Reicht ja für den Anfang.
Andere Controller hast Du noch nicht?
 
Servus Moe.

Ich bin auch so ziehmlich neu hier und arbeite auch mit dem STK-500. Meine ersten Schritte hab ich mit dem Studio 4 gemacht. Ich finde es für einen Anfänger viel einfacher zu bedienen.
Meine erste Aktion am STK-500 war dann, das Programm im mitgelieferten 8515 versehentlich zu löschen.
Das Studio 6 bietet wohl einiges mehr, aber braucht man das Anfangs? Im Moment versuche ich auf Studio 6 umzusteigen, was schon eine kleine Hürde ist. Klar, wenn man von Anfang an gleich mit Studio 6 arbeite ist es einfacher als sich später umgewöhnen zu müssen.
Wichtig ist die Freude an der Sache und die Bereitschaft zum Lernen. Dann geht´s zügig voran. Die Zeit ist halt bei mir der limitierende Faktor. Das läuft alles nebenher in der Freizeit.
Wünsch Dir jedenfalls gutes Gelingen. Und Leute zum Fragen sind immer irgendwo da.

Gruß

Gottfried
 
Hallo,

Ich bin auch so ziehmlich neu hier und arbeite auch mit dem STK-500. Meine ersten Schritte hab ich mit dem Studio 4 gemacht. Ich finde es für einen Anfänger viel einfacher zu bedienen.

das Studio4 ist nicht so platzfressend auf dem PC. Ich finde es eigentlich schöner. Für Assembler reicht es absolut aus. Bei C (was ich nicht benutze) muß man aber den GCC (heißt glaube ich WinAVR) nachinstallieren. Beim 5er oder 6er Studio ist da schon was drin.

Mit dem STK500 kann man auch mit Bascom programmieren.Nur die Fuses bedient Bascom über das einzubindende Atmel-Brennprogramm nicht (war bei mir jedenfalls so). Die müßte man dann direkt über AVR-Studio bearbeiten. Ist aber auch kein Problem.

Bei mir läuft das STK500 wunderbar an nem USB-Seriell-Dongle. Man benötigt also keine physikalische Serielle am PC/Laptop.

Ach ja :eek: ... herzlich willkommen im Forum :flowers:

Gruß
Dino
 
Danke

Hallo Zusammen

Danke erstmal für die freundliche Begrüßung und die vielen und guten Tipps. Ich bin ja nun schon etwas weiter und es blinken schon die LED's auf dem STK wechselweise. Also ist die Hürde des Anfangs und des Code-Übertragens auf den Controller genommen.
@ LotadaC: Ich habe einen USB-RS232-Adapter dran, den ich für CAT-Interface (PC-Receiver Funkempfang!) benutzt habe, und von dem ich wußte, daß der Treiber gut funktioniert. Mein kleines Blink-Test-Proggi ist mit C auf dem Studio6 geschrieben. Die Hürden mit den Fehlermeldungen beim Compilieren habe ich, wie immer in solchen Fällen, mit "LEO", dem Onlinetranslator, gemeistert.
Ich habe auch ein paar gute Seiten mit Erklärungen und Basiswissen zu C und den AT's gefunden.
Ich habe noch ATTiny85 im Schubkasten, wegen der geplanten Zielapplikation (siehe unten).

Ich hoffe, ich finde in dieser Woche Zeit, mich in die Auswertung von Tasterzuständen samt Interrupt und Programmschleifen einzuarbeiten.

Hier nur kurz, warum ich auf AVR's gekommen bin: Ich will eine temperaturgesteuerte Lüftungsklappen- und Lüftersteuerung für unser Kleingewächshaus bauen. Dazu liegen motorbetriebene Lüftungsklappen von Pollin mit Zeitsteuerung bereit, welche elektronisch entkernt werden und dann vom Controller mit kurzen Schaltimpulsen über 2 Relais auf- oder zu gesteuert werden. In Stellung auf soll dann der Lüfter anlaufen. Ich hatte schon 2 TLC555 auf meinem Steckbrett, da kam mir die Idee, dieses Projekt einfach als Anlaß für diesen Neustart zu benutzen.
Mal sehen, was draus wird.

LG an Alle aus Ostwestfalen/Lippe
Moe
 
...Das Studio 6 bietet wohl einiges mehr, aber braucht man das Anfangs?...
Das kommt darauf an...
Wenn Atmel die älteren Entwicklungsumgebungen nicht mehr pflegt, werden neuere Prozessoren nicht mehr unterstützt. Ok, die Prozessordefinitionsdateien könnte man selbst schreiben/anpassen, Ob man das mit der Signatur hinbekommt (sonst brennt der ja nicht), hab ich mir nicht angesehen), aber beim Simulator seh ich dann schwarz...

Das 4er-Studio unterstützt TPI erst ab Version 4.18, und dort mit dem 2ten oder 3ten ServicePack - das kann aber auch das STK500 nicht.

Die Bugs um den Tiny2313A und den Tiny4313 betreffen sofern ich mich erinnere auch die neuen Versionen...
 
Hi
Auch wenn ich aus Zeitmangel nicht jeden begrüße, ab und zu finde ich die erforderliche Minute. Wenn du aus der Entwicklung der Z80 kommst, ist Assembler ein ziemlich einfacher Einstieg. Aber die Sprache ist eigentlich gar nicht so wichtig. Ziele sind es und so kann ich dir nur Erfolg wünschen.
Gruß oldmax
 
Melde mich zurück

Hallo

Nochmals Danke für die freundliche Aufnahme im Forum.
Da ich jetzt Urlaub habe, bin ich erst in den letzten Tagen dazu gekommen, mich weiter mit meinem Vorhaben (Lüfter- und Klappensteuerung) zu beschäftigen.
Die Auswertung des Zustands eines IO-Pins schaltet bei Low einen Ausgang (Klappe öffnen) für 2 s auf High und den Ausgang für den Lüfter auf High. Bei High am IO-Pin schaltet der dritte Ausgang (Klappe schließen) für 2 s auf High und der Lüfterausgang auf Low. Hier mal der Code:


[CCODE]#include <avr/io.h>

#define F_CPU 1000000UL
#include <util/delay.h>


int main(void) {

uint8_t status = 0;

DDRB |= (1<<PB1); // Ausgang LED1
DDRB |= (1<<PB0); //Ausgang LED2
DDRB |= (1<<PB4); // Ausgang LED3
PORTB |= (1<<PB1); // High
PORTB |= (1<<PB4); // High
PORTB |= (1<<PB0); // High
DDRB &= ~(1<<PB2); // Eingang
PORTB |= (1<<PB2); // Pullup aktive

for(;;) { //Forever
switch (status)
{
case 1:
if ( PINB & (1<<PINB2))
{
status = 0;
PORTB &= ~(1<<PB1); //LED1 an
PORTB |= (1<<PB0); // LED2 aus
_delay_ms(2000);
PORTB |= (1<<PB1); //LED1 aus
}
break;

case 0:
if (! (PINB & (1<<PINB2)))
{
status = 1;
PORTB &= ~(1<<PB4); //LED3 an
PORTB &= ~(1<<PB0); //LED2 an
_delay_ms(2000);
PORTB |= (1<<PB4); //LED3 aus
}

break;
default: status = 0;
break;
}
}
}[/CCODE]

Geschrieben mit AtmelStudio 6 und realisiert mit ATTiny85 auf STK500. Basis für das Prog war eine "Statemachine" aus dem Franzis-AVR-Microcontroller-Kochbuch von Meister/Salzburger.
Sieht sicher nicht allzu elegant aus, funktioniert aber. Für Tips und Hinweise dazu bin ich natürlich immer dankbar.
Die CPU-Taktinformation habe ich reverse angepasst, bis die Delay-Zeiten ungefähr passten. Muß mich in die Taktvorgabenprogrammierung erst noch "reindenken", da ich den ATTiny mit möglichst niedriger Taktfrequenz betreiben will. da Solarspeisung und Akkubetrieb. Die 0,3µA bei 1MHz sind schon reizvoll, aber bei einem 10W-Modul, 12V/7Ah-Akku und ca. 0,3A Lüfterstrom (der nur bei Sonneneinstrahlung benötigt wird) sicher nicht relevant.

Jetzt brauche ich einen Tip zur Temperaturmessung. Sollte ich unbedingt mit einem externen Sensor arbeiten oder wäre der interne Sensor ausreichend und nutzbar?
Als Genauigkeit genügen mir 2-3° und die Hysterese zwischen Lüften und Geschlossen sollte größer 5° sein.
Es ginge natürlich auch ein Bimetallschalter mit 35°C Schalttemperatur am IO-Pin, aber dabei würde ich ja nichts lernen.
Komme ich mit dem Setzen eines Bits als Auswertungsergebnis aus, welches ich dann statt des IO-Pins abfrage, wenn das überhaupt funktioniert, oder muß ich mich zwingend mit Interrupts beschäftigen?
Was muß ich mit #include für die Registerauswertung an Bibliotheken (ich hoffe, der Begriff ist richtig?!) einbinden?

So, ich glaube, das ist schon eine Menge an Fragen und mit den eventuellen Antworten werde ich auch ne Menge Denkarbeit haben.
Sollte meine Fragestellung unklar sein, bitte einfach nachfragen. Ihr merkt ja schon, daß noch eine Menge Unsicherheit und Unwissen dabei ist.

Im Voraus vielen Dank und bis Bald

Nachtrag: Ich denke, das diese Antwort sicher nicht mehr in dieses Thema gehört und eigentlich ein eigenes Thema ist. Ich bin mir aber nicht sicher, wo es hin gehört. Also einfach ein Tip, wohin, und ich mach dort dann ein Thema auf oder jemand mit Berechtigung verschiebt es dorthin!
 
Hmm...
Ich weiß gar nicht wo ich da jetzt anfangen soll...

Ok, die Clock... da hast Du Dir für den Anfang 'n ganz schönen Brocken (verständnistechnisch) aufgeladen...

Schau mal hier ins Datenblatt auf Seite 23.
Dich interessiert erstmal nur der Teil unter/bis zur "AVR Clock Control Unit".
Gaaz unten siehst Du die möglichen Taktquellen
  • externe Clock (Quarzoszillator, etc)
  • externer Quarz/Resonator (0,4..20MHz) über den internen Crystal Oscillator
  • externer Uhrenquarz (32,????kHz) über den internen Low-Frequency Crystal Oscillator
  • interner Watchdog-Oscillator (128kHz)
  • interner RC-Oscillator (8MHz)
  • interne PLL (aus den internen RC-Osci, effektiv 8 oder 16MHz - Figure 6-2.)
(den Tiny15-Kompatibilitätsmodus lasse ich mal raus)
Eine dieser Quellen wird über den Clock Multiplexer auf den Prescaler gelegt, welche wird über die CKSEL[3..0]-Fusebits festgelegt.
Der Prescaler teilt den anliegenden Takt nun noch einmal durch einen diskreten Wert, welcher im CKLPR (Clock Prescale Register) festgelegt wird.
Dieses Register kann zur Laufzeit manipuliert werden, beim Reset hat der Teiler (abhängig vom CKDIV8-Fusebit) den Wert 8 oder 1.
Auslieferungszustand der AVR ist üblicherweise der interne RC-Oscillator mit 'nem Prescaler von 8 - also effektiv 1MHz.
Das paßt dann auch zum, von Dir ermittelten "#define F_CPU 1000000UL".
Damit sagst Du dem Studio aber nur, wie schnell der AVR (angeblich/deiner Meinung nach) getaktet ist, das Studio berechnet aus dieser Angabe dann etwaige Timings (delay, Baudrate, etc) - es hat also keine Auswirkung auf den tatsächlichen Takt
(mMn - Halbwissen! - Die genannten Fuses werden so nicht manipuliert, oder Dirk?)

Noch was zum Programm selbst:
Du definierst die Beinchen bitweise. Das geht natürlich, aber es kostet Dich hier unnötig Zeit und Programmspeicher.
Ich komme mit den C-Zuweisungen immer surcheinander, aber Du scheinst read-modify-write-Zuweisungen zu nutzen.
Dabei wird also erst das entsprechende Register (DDRx, PORTx) aus dem I/O-Bereich (in ein Rechenregister) geladen, danach mit einer Bitmaske (je nur ein Bit) verANDet bzw verORrt, und das Ergebnis zurück gespeichert.
Für jedes Bit, also beim init vermal für jedes der beiden Register.
Wenn man die Bits der Maske zusammenfasst, kann man das einmal RMW-Zuweisen.
Falls das überhaupt RMW sein muß.
'Ne FOR-Schleife als Endlosschleife ist auch... extravagant...;)
(Aus Sicht des Assemblerprogrammierers ist das eh alles eins... äh... zwei: es gibt entweder bedingte oder unbedingte Sprünge. Echte Endlosschleifen mit unbedingten Sprüngen, oder eben 'ne reaktion auf irgend'ne Bedingung (die als Ergebnis einer Rechenoperation (insbes. compare) erfüllt ist oder nicht) IF..THEN, WHILE..DO, DO..LOOP UNTIL oder wie die alle heißen, sind letztlich bedingt...
Durch die delays blockiert das Programm in diesen Momenten, wenn also ausserhalb des Switch-Blockes noch andere Programmblöcke wären, würden die bei jeder Tastenbetätigung 2s warten müssen. Um das zu umgehen, brauchst am sinnigsten den Timer, dadurch ändert sich aber einiges an Deiner "Maschine". Durch die delays bekommst Du aber nebenbei eine Software-Entprellung des Tasters geschenkt.
In allen CASEs prüfst Du, ob der Taster betätigt ist. Diese Prüfung könntest Du "ausklammern" (also FOR { IF { SWITCH { CASE A {} CASE n {} } } } klar?)
Zum internen Sensor kann ich nicht viel sagen - letztendlich wird der mit dem ADC gemessen (ADC4 im ADMUX), gegen die interne 1,1V-Referenz.
Angeblich soll der "annähernd" linear sein, auf Seite 133 steht aber einerseits 1LSB pro °C, in der Tabelle 17-2 hätte die Differenz -40..85°C (125K) andererseits 140 ADC-Ergebniswerte. Ob DIR das hinreichend linear ist, kann ICH Dir nicht sagen - probiers doch mal aus...
Die Frage mit den IRQs ist mir nicht klar... Bei der ADC-Messung?
Du kannst den ADC auch ununterbrochen messen lassen, oder halt wenn gewünscht einmal. Und dann wann Du willst prüfen, ob er fertig ist (bzw in 'ner Schleife darauf warten), und das Ergebnis auslesen.
Zur Prozessordefinitionsdatei: zumindest bei Assembler muß man irgendwo vorher das Device (also den Controller) gewählt haben - das 6er-Studio inkludiert dann die entsprechende Datei selbst beim compilieren. Ob Du sonst noch irgendwelchen C-Bibliotheken nutzt, weiß ich nicht.
Die Register und Bitnamen (der I/O-Register) sind in der Definitionsdatei definiert). Beim Compilieren erscheinen die dann irgendwo bei den dependencies oder so (links)
 
Danke

Hallo LotadaC
Danke für die Antwort. Wie schon erwartet: Sehr viel Input für mein. etwas in die Jahre gekommenes Gehirn. Aber Du hast mir z.B. schon mit dem Hinweis, daß der ADC auch durchlaufend messen kann. Ich müßte wohl nur sicherstellen, daß das ADC-Data-Register einen gültigen Wert enthält. Aus diesem Unwissen heraus die Überlegung, den ADC-Interrupt als Bedingung für die Auswertung des ADC-Data-Registers zu benutzen. Ich habe jetzt gerade das Datenblatt des ATTiny85 vor mir und versuche die Bedingungen in den ADCSRA und ADCSRB Registern zu definieren und die Auswertung des Datenregisters in die Schleife zu "implementieren" (heißt das, glaube ich?!).
Und ich habe, glaube ich, schon wieder einen Fehler gemacht, da ich diesen Mess- und Auswertungsablauf gleich in mein Programm "reinprogrammieren" will. Ich fange besser nochmal an, werte in einem Testprogramm den ADC aus und setze einfach ein Bit in Abhängigkeit vom Messwert. Ist sicher besser, da ich mit dem "Was gehört im Programm wo hin" und "wie schreibt man es" auch noch etwas auf Kriegsfuß stehe.
Im Moment habe ich zudem auch massive Schwierigkeiten mit der Bedienung des AtmelStudios, da ich immer noch nicht begriffen habe, wann ich ein neues File, wann ein neues Projekt eröffnen soll. Keine Ahnung, wo die Unterschiede sind? Auch ein Verändern von Speicherorten meiner Dateien (auf meinem Rechner wird eigentlich nichts auf der System-SSD gespeichert) geht zwar, allerdings mit der Folge des Nichtfunktionierens des Compilers (Builders: wieder keinen Plan, wo der Unterschied ist?) mit engl. Fehlermeldung, deren Sinn sich mir einfach nicht erschließt. Und auch nach dem Studium diverser Tutorials (teils auch deutsch) raucht mir nur der Kopf durch die Notwendigkeit, unklare, nicht erklärte, Sachverhalte woanders und dann meist in Englisch mit dauernder Untestützung von LEO-Dictionary nachzuschlagen.
Dies ist nur ein kleiner Abriß der Schwierigkeiten mit denen ich kämpfe. Aber es ist ein Kampf, bei dem man nur siegen, sprich gewinnen kann!
Und da muß ich nun mal durch.

Nur noch eine Frage (selbstredend an Alle, die dies lesen): Wo sollte ich dieses Thema weiter diskutieren? Wäre "AVR-Mikrocontrollerfamilie>Hardware" richtig? Dann müßte ich jedoch in mehreren Unterforen weitermachen und jedes Problem aus dem Zusammenhang reißen?

Danke nochmals und Grüße aus OWL
Thomas
 
Das wesentliche Schema des ADC hast Du sicher auf Seite 123 gefunden und (weitgehend) verstanden, denke ich -> ansonsten frag nach.

Der ADC wird über 6 Register bedient/gesteuert:
ADCSRA
ADCSRB
ADMUX
DIDR0
ADCH
ADCL

nach einer Wandlung wird das Ergebnis in die beiden ADCH/L-Register kopiert. Da das ein 10bit-ADC ist, benötigt er 2 Ergebnisregister. ADLAR in ADMUX legt fest, ob das Ergebnis rechtsbündig oder linksbündig (ADLAR=1) erscheint.
CAVE!: sobald das ADCL gelesen wird, werden beide Register für den ADC gesperrt, bis auch das ADCH gelesen wurde. Wenn also dazwischen eine weitere Konversion abgeschlossen wird, geht dieses neue Ergebnis verloren. Dabei wird trotzdem das "Ich-hab-fertig"-Flag (ADIF) gesetzt, kann also trotzdem den IRQ triggern.
Mit ADLAR=1 genügt es also, nur ADCH zu lesen, wenn man nur 8bit-Auflösung braucht, klar?
Im ADMUX wird:
  • mit REFS[1..0] die Referenzspannung festgelegt
  • mit MUX[3..0] der Kanal/die Kanäle (der kann ja auch differentiell messen -> Eingangsmuxe auf Seite 123) festgelegt
  • mit ADLAR festgelegt, ob das Ergebnis rechts- oder linksbündig im ADCH/L erscheinen soll
Im ADCSRA wird:
  • mit ADEN der ADC überhaupt erst aktiviert
  • mit ADSC eine Konversion gestartet
  • mit ADATE festgelegt, ob irgendeine Quelle eine Konversion starten darf
  • mit ADIE der "Hab fertig"-Interrupt freigegeben
  • mit ADPS der Prescaler festgelegt - für volle Auflösung sollte der ADC zwischen 50..100kHz getaktet werden - mit 8bit habe ich aber auch schon 2MHz genutzt
  • eine fertige Konversion mit ADIF signalisiert
Beendet der ADC also eine Konversion, wird das Ergebnis in die ADCH/L-Register geschrieben (wenn die nicht blockiert sind).
Unabhängig davon wird das ADIF gesetzt. Ist der Interrupt mit ADIE befähigt und sind die Interrupts global im SREG freigegeben, wird der Interrupt ausgelöst. Dabei würde dann automatisch das ADIF gelöscht werden (erledigt).
Wird das ADIF nicht gelöscht, bleibt es gesetzt, klar. Dann können trotzdem weitere Konversionen gestartet werden.
Du kannst aber auch selbst auf das ADIF prüfen (ob es gesetzt ist). Und es dann durch beschreiben mit einer 1(!) löschen.
Im ADCSRB hast Du 2 Bits, die nur differentielle Messungen (und dort die Polarität der Eingänge zueinander) betreffen.
Dann die Auswahl der automatischen Triggerquelle (siehe ADATE in ADCSRA) - diese Quellen sind diverse Interrupt-Flags, eine steigende Flanke triggert die Konversion. Daraus folgt, daß das Flag vor der nächsten Konversion irgendwann irgendwie gelöscht werden muß. Lediglich im "free running mode", welcher an das ADIF selbst gekoppelt ist, scheint das nicht nötig zu sein:
S.124 schrieb:
Using the ADC Interrupt Flag as a trigger source makes the ADC start a new conversion as soon as the ongoing
conversion has finished. The ADC then operates in Free Running mode, constantly sampling and updating the
ADC Data Register. The first conversion must be started by writing a logical one to the ADSC bit in ADCSRA. In
this mode the ADC will perform successive conversions independently of whether the ADC Interrupt Flag, ADIF is
cleared or not
.
Mit ACME kann der Ausgang des Eingangsmultiplexers (ADMUX) auf den Analog Comperator umgelegt werden, dabei wird der ADC abgeschaltet.

Im DIDR0 kannst Du für jeden "analogen" Pin den digitalen Eingangsfilter "abklemmen" - wenn Du analog messen willst, klar.

Außerdem wirkt sich noch das PRR (PowerReductionRegister) auf den ADC aus. Dort kann die Clock (unter anderem) vom ADC getrennt werden, der ADC "heruntergefahren". Allerdings sollte der ADC dann vorher disabled sein (ADEN in ADCSRA) -> falls hier auch noch das letzt µ Strom gespart werden soll...

P.S.: der Tiny25/45/85 ist recht interessant - ich bin gerade mit 'ner (groben) Übersicht aller Tinies beschäftigt, wenn da irgendwann(!) mal was vorzeigbares rauskommt, muß mir Dirk sagen, wie ich die OpenOffice-Tabelle hier in eine präsentierbare Form bekomme - interessiert vielleicht den einen oder anderen (und ja, die Database kenne ich...)
 
Hallo Thomas!
Nur noch eine Frage (selbstredend an Alle, die dies lesen): Wo sollte ich dieses Thema weiter diskutieren? Wäre "AVR-Mikrocontrollerfamilie>Hardware" richtig? Dann müßte ich jedoch in mehreren Unterforen weitermachen und jedes Problem aus dem Zusammenhang reißen?

du kannst hier in dem Thema einfach weiter schreiben. Falls du ein ganz neues Thema hast, wäre es gut, wenn du in einem Oberforum "Hardware, Software, Programmierung" ein neues Thema mit einem passenden Thementitel erstellt. Dies hilft dann anderen Usern, sich besser zurechtzufinden (es muss nicht immer genau im passenden Unterforum sein, Themen können Moderatoren auch nachträglich noch verschieben, wenn es gar nicht ins Forum passt).

Dirk :ciao:
 
Dann nochmals Danke

Also die Initialisierung des interne Temperatursensors und die Auswertung (ich brauche ja nur ein > als und ein < als) funktioniert. Damit reicht mir auch die Linearität. Der Bereich liegt bei max. 10C/ ca. 11LSB. Jetzt muß ich nur noch meine Statemachine "implantieren", dann kommt der Braedbordaufbau. Ich hab Die letzten Antworten erst gerade gelesen, aber was man selbst erarbeitet hat hält eh wesentlich besser im Kopf und ich habe wenigstens begriffen, was ich da mache.
Auch wenn mein Code nicht schön aussieht, sollte jemand Interesse haben, ich poste Ihn gerne.

Danke für die Hilfe und die Tipps.

@Dirk: Werde ich dann so tun.

Gruß Moe
 
Oldmax hat Dir ja bereits Assembler nahegelegt - ich schließe mich da mal an.
Außerdem könntest Du mehr zum Gesamtkonzept sagen...
Du hast irgendwelche Klappen, die Du mit je einem Relais zum öffnen und schliessen ansteuerst?
Der Lüfter wird letztendlich über die Klappenstellung geregelt?
Auslöser soll dann die Temperatur sein (hysteresebehaftete Schwelle), welche Du mittels internem "Sensor" (was auch immer das konkret ist) erfassen willst.

In welchem Intervall müssen die Messungen denn erfolgen - also wie schnell ändert sich die Temperatur, und wie fix muß darauf reagiert werden? sollte doch relativ träge sein können.

Stell doch einfach den Code und ggf das Konzept (Zustandsmaschine) rein, dann könnten wir (wenn Du willst) darüber diskutieren (auch, weil Du Dich verständlicherweise noch (!) gegen Interrupts sträubst - nach etwas Umdenken sind die äußerst praktisch...)

P.S.: Die ganze Aufgabe schreit ja wieder mal nach meinem kleinen Liebling, dem Tiny5/10 (mangels internem Temp-Sensor eben mit 'nem externem NTC oder so) - aber der wäre wohl für den Anfang etwas ... exotisch;)
Edit:
Du hattest oben ja die State-Maschine erwähnt - sowas skizziert man sich ja selbst üblcherweise vorher mit'ner Bleistiftskizze...
Bei Dir könnte das dann zB so aussehen:
Lüfterklappensteuerung.png
(Programmablaufplan Designer von Friedrich Folkmann)
Die Bitschubserei im Integrator ist natürlich in ASM sehr leicht zu realisieren - Resultat ist, daß mindestens 8 aufeinanderfolgende Messungen kleiner als min/größer als max sein müssen, um umzuschalten...
 
Projekt Wärmeabfuhr aus Gewächshaus über Lüftungsklappen und Lüfter

Guten Morgen
Hier wegen Deiner Nachfrage mal das Projekt:

Stand: Gewächshaus 2,50mx1,90m. Bekommt ab ca 13:00 volle Sonne und heizt sich dann beträchtlich auf, so daß die Temperatur und die Luftfeuchte Pflanzenschädliche Werte annehmen. Da wir arbeiten gehen, lassen wir dann bei Sonnenwetter die Dachklappen und die Eingangstür ab früh vorsichtshalber auf. Dadurch erwärmt sich die Luft natürlich langsamer und der Treibhauseffekt (hier mal positiv gemeint) bleibt aus. Zudem haben Insekten und Schnecken ungehinderten Zugang zu den Pflanzen.

Meine Idee: Abluftklappe(n). Bei Po...in (Best.Nr.:320 378) gibt es Motorbetriebene Abluftklappen für ca. 3,50€. Die eingebaute Zeitsteuerung fliegt raus und man hat eine gute Basis für Automatisierung der Entlüftung. Der Motor ist für 3V ausgelegt und öffnet oder schließt die Klappen in ca. 1,5s. Dazu wird noch ein 140mm-Axiallüfter innen montiert und das ganze an eine Stirnseite unter dem First eingebaut. Betrieben wird alles aus einem Solargespeisten 12V/7Ah-Akku mit 10W-Modul.

Der Ablauf: Bei Temperatur über ca. 35°C öffnet ein Impuls (Ausgang1) von max. 2s die Klappen und der Lüfter (Ausgang2) wird gestartet. Hat sich die Innentemperatur auf unter 30°C abgekühlt, schaltet der Lüfter ab und der dritte Ausgang steuert den Klappenmotor für 2s mit umgepolter Spannung an und die Klappen schließen sich. Ich rechne bei sehr warmem und sonnigem Wetter mit höchstens 3-5 Schaltvorgängen am Tag. Leistung wird nur gebraucht, wenn der Lüfter läuft und dann scheint ja auch die Sonne. Sollte mehr Zuluft benötigt werden (Das Gewächshaus ist zwar recht dicht, aber nicht hermetisch abgeschlossen), habe ich noch eine zweite Klappe, deren Motor einfach parallel zum Ersten geschaltet wird und die dicht über dem Boden gegenüber der Abluft mit einem feinmaschigen Gitter als Insktenschutz montiert werden kann.
Wie man sieht, werden weder an die Temperaturgenauigkeit hohe Anforderungen gestellt, noch ist für den Steuerungsablauf hohe zeitliche Präzision oder schnelle Reaktion gefordert.
Die Kopplung der Ausgänge an Relais und die Spannungsversorgung sollte ich als Elektroniker sicher hinbekommen. Mit Solarmodulen und Akkuladung habe ich auch schon reichlich Erfahrungen gesammelt.Die Steuerung sitzt im Lüftungsklappengehäuse und hat daher direkten Kontakt mit der Innentemperatur. Ich habe ja zur Not noch 3 Pins frei, so daß ich ohne weiteres auch einen externen Fühler nachrüsten kann (ADC's an PB3/4/5).

Auf Fragen und Anregungen werde ich gerne reagieren, nur habt bitte Verständnis, wenn es mal etwas länger dauert. Ich habe auch immer was im Garten und in der Werkstatt zu tun und muß ab Montag, den 08.09.2014 wieder arbeiten, da der Urlaub zu Ende ist.

Am Rechner bin ich ohnehin nur bei schlechtem Wetter oder Abends mal ne Stunde. Es war jetzt nur günstig, da wir mehrere Tage verregnetes, kaltes Wetter hatten.

@LotadaC: Mit Assembler werde ich mich sicher auch noch beschäftigen, will aber erstmal dieses Projekt über die Bühne bringen. Zudem muß ich erst mit dem Atmelstudio richtig klarkommen, bevor ich mich mit einer neuen Sprache oder einer eventuellen neuen Entwicklungsumgebung beschäftige. Im Moment bin ich mit den Möglichkeiten der Kombination STK500/AtmelStudio 6.2/C sehr zufrieden und es wird noch dauern, bis ich dort an Grenzen stoße.
Ich bin übrigens Dank Deines Hinweises auf meine umständliche Portdefinition dazu übergegangen, Port- und andere Register wieder in der Form "Portx = 0b00010110" zu definieren. Ist eine Erfahrung aus dem Initialisieren der ADC-Register und für mich übersichtlicher.

Und nun nach dem Motto: "Immer Eins nach dem Anderen" und "Ich bin nicht auf der Flucht" geht es erstmal in den Garten. Die Sonne scheint, die Mücken zwicken, hohes Gras und nichts zu ....lesen?!:p

LG aus OWL Moe
 
Nachtrag

@LotadaC: Hab jetzt gerade Deinen PAP gesehen. Ist schön anzuschauen, aber verkompliziert für mein Empfinden meine Idee doch etwas und ich glaube mein PAP erschließt sich wohl auch aus meiner Beschreibung. Ich zerlege Projekte eh lieber in übersichtliche kleine Projektteile, löse diese einzeln und fange dann an, Alles zusammenzubasteln. Für umfangreichere Projekte ist es jedoch sicher notwendig und hilfreich. Wir haben das früher auch so gehandhabt, vor Allem, wenn mehrere Beteiligte an einem Projekt arbeiten. Sonst geht nie was Zusammen.

Der Code kommt, wenn die Statemachine mit der Ausgangssteuerung zusammen fertig ist.
Hier nur die INI vom ADC mit internem Temperatuesensor:

[CCODE#include <avr/io.h>
#include <inttypes.h>
#define F_CPU 1000000UL
#include <util/delay.h>

uint16_t foo; // Variable für ADC Wert; Temperatur
int main(void)
{
ADMUX = 0b10001111; // Int. Tempsensor; int. Refereznspan.
ADCSRA =0b11100111; // Enable ADC/Autotrigger/Starte erste Wandlung/Taktteiler 128
ADCSRB = 0b00000000; // u.A. Free Runnig Mode
DDRB = 0b00000011; // LED 0 und 1
PORTB = 0b00000011; //LEDS aus
foo = 0;][/CCODE]

Die LEDS benutze ich nur zur Signalisierung, daß etwas und Was passiert.

Gruß Moe und erstmal weg!
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)