Forum: Mikrocontroller und Digitale Elektronik attiny13 als 2-Kanal Zähler mit datenübertragung


von Florian (Gast)


Lesenswert?

Hallo zusammen,
ich möchte gerne einen 2-Kanal Zähler bauen der 2 getrennte Kanäle 
zählen kann und diese Zählerstände über serielle Kommunikation in 
regelmäßigen Abständen übertragen kann.

Ich habe dafür den ATTINY13 ins Auge gefasst, bin mir aber nicht sicher 
ob ich mein Vorhaben damit realisieren kann.

Ich weiß, dass der attiny13 recht begrenzt in seiner Ausstattung ist. 
Ich denke die 1KB Flash dürften das größte Problem darstellen, zumal ich 
ja recht viele Funktionen implementieren muss.

Ich habe den attiny13 aus verschiedenen Gründen angedacht:
- Klein (8PDIP),
- Außreichende Anzahl Ports (2 PortPins fürs Zählen, + 1 Port für 
Serielle Kommunikation)
- Kalibrierter interner Oszillator,
- Kaum externe Beschaltung notwendig

Je mehr ich darüber nachdenke komme ich aber zu der Ansicht dass der 
attiny13 wegen seinem begrenzten Flashspeicher und nur einem 8-Bit 
Zähler nicht sinnvoll zu verwenden wäre. Den 8-Bit Timer würde ich aber 
nicht fürs Zählen der PortPins verwenden, sondern eher für das Senden 
der seriellen Daten. Das Zählen könnte ich über Software realisieren.

Was habt ihr für eine Meinung?
Ich wäre sehr Froh von eurer Erfahrung profitieren zu können.

Viele Grüße und schon mal Dank im Voraus,
Florian

von Konzept? (Gast)


Lesenswert?

Wie weit muß er denn zählen? Für große Zahlen ist der RAM zu klein. 
Bitte genauer spezifizieren. Stoppuhr, Frequenzzähler? Wie hattest du 
dir das zählen in SW vorgestellt.

von ddd (Gast)


Lesenswert?

Dann nimm einen Tiny85, der hat 8k und eine USI ;-)

von Karl H. (kbuchegg)


Lesenswert?

Florian schrieb:

> Ich weiß, dass der attiny13 recht begrenzt in seiner Ausstattung ist.
> Ich denke die 1KB Flash dürften das größte Problem darstellen

Die sind das kleinste Problem. Mit 1k kommst du locker aus.
Aber die fehlende Hardware-UART würde mir mehr Kopfzerbrechen machen.

> Was habt ihr für eine Meinung?

Nimm dir einen vernünftigen Tiny, der über die Hardware verfgt, die du 
brauchst. Alles andere ist absichtliches sich selbst Prügel zwischen die 
Beine werfen.

Der Flash und das SRAM sind nicht deine bestimmenden Faktoren. Die 
Hardware-UART ist es und je nachdem wie schnell deine Pulse sind, die du 
zähen willst bzw. wo die herkommen, kommt auch hier noch ein Limit dazu. 
Es lohnt nicht, hier um Pfennigbeträge zu feilschen. Was du dir an Cent 
beim µC sparst, steckts du als Euros in Form deiner Arbeitszeit wieder 
rein.

von Florian (Gast)


Lesenswert?

Hallo zusammen,
oh, ich muss sagen ich bin überwältigt über das schnelle Feedback.

Also, ich hole etwas weiter aus:
Ich möchte die Pulse von einem Anemometer und einem Regenmesser zählen.
Das Anemometer schickt pulse zwischen 0,4 Hz und 100 Hz. Der Regensensor 
immer dann wenn eines der Kippschälchen voll ist, also recht langsam.
Beide Sensoren sind vereinfacht gesagt Reedschalter.

Ich möchte die Zählerstände jeweils kumulieren und in einem Intervall 
von einer Minute übermitteln. Das bedeutet im Endeffekt, dass der Zähler 
für das Anemometer innerhalb einer Minute auf 6000 ansteigt, evtl etwas 
mehr oder auch deutlich weniger. Der Regenmesser dürfte unkritisch sein, 
da ich nicht denke dass wir in Deutschland je einen Monsun in einem 
solchen Ausmaß haben werden dass da ein Pufferüberlauf stattfinden 
würde. :-)

Viele Grüße,
Florian

von Peter D. (peda)


Lesenswert?

Konzept? schrieb:
> Wie weit muß er denn zählen? Für große Zahlen ist der RAM zu klein.

Quatsch.
Mit 64 Byte kannst Du bequem solange zählen, bis die Sonne explodiert 
und die Erde aufhört zu existieren.


Peter

von Peter D. (peda)


Lesenswert?

Florian schrieb:
> Das bedeutet im Endeffekt, dass der Zähler
> für das Anemometer innerhalb einer Minute auf 6000 ansteigt

Das sind für den ATtiny13 keine Zahlen, sondern klitzekleine Zählchen 
(nur 2 Byte).
Der Flash ist auch dicke ausreichend.

Das einzige Problem ist, eine Datenübertragung zu wählen, die ohne Quarz 
auskommt, (SW-)UART fällt also weg.
Ich würde daher zum ATtiny25 raten, da kann man einen Quarz als F_CPU 
anschließen.


Peter

von Florian (Gast)


Lesenswert?

Hallo Peter,
Du hast recht, 64 Byte sind zum Zählen mehr als genug, aber ich brauche 
ja auch RAM für die serielle Kommunikation und etwas Logik außen herum. 
Ich befürchte daher dass der Rest wesentlich größer sein wird als 64 
Byte. Vorallem wenn ich Software UART machen muss.

Peter Dannegger schrieb:
> Quatsch.
> Mit 64 Byte kannst Du bequem solange zählen, bis die Sonne explodiert
> und die Erde aufhört zu existieren.

von Karl H. (kbuchegg)


Lesenswert?

Florian schrieb:
> Hallo Peter,
> Du hast recht, 64 Byte sind zum Zählen mehr als genug, aber ich brauche
> ja auch RAM für die serielle Kommunikation und etwas Logik außen herum.

Ah geh. Was brauchst du denn da. 10 Byte, 20?
Wenns mehr als 20 sind, sollten wir uns mal über Speicher-Urassen 
unterhalten.

> Ich befürchte daher dass der Rest wesentlich größer sein wird als 64
> Byte.

Quatsch

> Vorallem wenn ich Software UART machen muss.

Dann mach halt keine.
Du musst dir ja nicht unbedingt einen Tiny nehmen, der keine Hardware 
UART hat.

von Florian (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Das einzige Problem ist, eine Datenübertragung zu wählen, die ohne Quarz
> auskommt, (SW-)UART fällt also weg.
> Ich würde daher zum ATtiny25 raten, da kann man einen Quarz als F_CPU
> anschließen.

Hallo Peter,
das befürchte ich auch, allerdings fällt mir gerade noch eine weitere 
Hürde ein, die ich vollkommen vergessen habe: Ich möchte die Daten gerne 
über Funk übertragen. An sich ist das nicht das Problem, aber für den 
Sender/Empfänger muss ich eine Manchester Kodierung verwenden. Das kommt 
daher, dass der Empfänger als einfacher Pendel-Empfänger gebaut ist. Ich 
verwende keine Selbst erfundene Schaltung, sondern ein Set von Conrad 
auf 868 MHz Basis.
Somit fällt eine integrierte USI dann doch wieder weg, oder?

von Ingo (Gast)


Lesenswert?

Selbst wenn man das Ding auf internem OSC laufen lässt, sollten einige 
langsame Datenraten mit wenig fehler drinnen sein, oder?

Ansonsten kann ich dir den Tiny2313 oder 4313 empfehlen, der hat 
HW-UART. Die USI ist etwas komplizierter.


Ingo

von Karl H. (kbuchegg)


Lesenswert?

Ingo schrieb:
> Selbst wenn man das Ding auf internem OSC laufen lässt, sollten einige
> langsame Datenraten mit wenig fehler drinnen sein, oder?

10% sind 10%.
Egal bei welcher Datenrate.

von Karl H. (kbuchegg)


Lesenswert?

Florian schrieb:

> das befürchte ich auch, allerdings fällt mir gerade noch eine weitere
> Hürde ein, die ich vollkommen vergessen habe: Ich möchte die Daten gerne
> über Funk übertragen.

Na das fällt dir ja bald ein.

> An sich ist das nicht das Problem, aber für den
> Sender/Empfänger muss ich eine Manchester Kodierung verwenden. Das kommt
> daher, dass der Empfänger als einfacher Pendel-Empfänger gebaut ist. Ich
> verwende keine Selbst erfundene Schaltung, sondern ein Set von Conrad
> auf 868 MHz Basis.

Welches Set?

von ddd (Gast)


Lesenswert?

Florian schrieb:
> Ich möchte die Daten gerne
> über Funk übertragen. An sich ist das nicht das Problem, aber für den
> Sender/Empfänger muss ich eine Manchester Kodierung verwenden. Das kommt
> daher, dass der Empfänger als einfacher Pendel-Empfänger gebaut ist. Ich
> verwende keine Selbst erfundene Schaltung, sondern ein Set von Conrad
> auf 868 MHz Basis.
> Somit fällt eine integrierte USI dann doch wieder weg, oder?

Also ich pack gleich meine Gummihandschuhe aus und ziehe Dir ALLE Würmer 
persönlich aus der Nase !
- Zählvorgänge <65000 = 16bit = 2byte (Tiny13, Tiny25/45/85)
- Funkübertragung via Modul, das wie angesteuert wird ?
Seriell, SPI, parallel ??
- Was sind noch für Würmer versteckt ?
Wenn Du's Dir leicht machen willst nimm gleich einen 16bitter oder 
32bitter, da kannst Du dann in einem Register zählen :-P

von Ingo (Gast)


Lesenswert?

> 10% sind 10%.
> Egal bei welcher Datenrate.

Ah, Sorry. Ich hatte es grad mit dem Fehler verwechselt der sich 
aufgrund unpassender Teiler einstellt verwechselt...

von Peter D. (peda)


Lesenswert?

Florian schrieb:
> Vorallem wenn ich Software UART machen muss.

Warum das denn?

SW-UART braucht gegenüber HW-UART genau 0 Byte mehr.
1
void sputchar( uint8_t c )
2
{
3
  c = ~c;
4
  STX_PORT &= ~(1<<STX_BIT);            // start bit
5
  for( uint8_t i = 10; i; i-- ){        // 10 bits
6
    _delay_us( 1e6 / BAUD );            // bit duration
7
    if( c & 1 )
8
      STX_PORT &= ~(1<<STX_BIT);        // data bit 0
9
    else
10
      STX_PORT |= 1<<STX_BIT;           // data bit 1 or stop bit
11
    c >>= 1;
12
  }
13
}

Wenn Du die Zahlen als ASCII übertragen willst, brauchst Du nur einen 
Puffer von genau:
1
char tx_buff[sizeof("65535")];
2
uint16_t count;
3
utoa( count, tx_buff, 10 );


Peter

von Florian (Gast)


Lesenswert?

Hallo zusammen,
also das Funk-Set ist dieses hier: 
http://www.conrad.de/ce/de/product/190939/Funk-Sende-Empfaenger-Set-868-MHz-Baustein-Sender-3-12-VACDC-Empfaenger-5-VACDC-Reichweite-max-200-m/2401030&ref=list

Die Übertragung ist eigentlich simpel: 1 Pin an der MCU generiert das 
Rechtecksignal für den Sender (Manchester-Codiert, da der Empfänger ein 
Pendelempfänger ist)

Wenn ich das richtig verstehe, ist die Datenmenge dann 4 Byte + 1 Byte 
Präambel um den Empfänger einschwingen zu lassen.

5 Byte sind nun nicht das Problem, selbst wenn es mehr sind (8, 10 oder 
wieviele auch immer) ist das aber meiner Meinung nach erst einmal nicht 
relevant.

Noch was generelles: Es tut mir leid, wenn ihr der Meinung seid, mir 
alles aus der Nase ziehen zu müssen. Ich bemühe mich so ausführlich wie 
möglich zu sein, dabei aber nicht zu viel drum herum zu reden. Ich bin 
halt noch recht neu im Forum. (Ich weiß, ich schreibe im Moment als 
Gast, das behebe ich noch)

von Karl H. (kbuchegg)


Lesenswert?

Florian schrieb:

> Die Übertragung ist eigentlich simpel: 1 Pin an der MCU generiert das
> Rechtecksignal für den Sender (Manchester-Codiert, da der Empfänger ein
> Pendelempfänger ist)

Und dabei gibt es so schöne Funkmodule, die man über eine UART 
anspricht. Aber ok.
Na gut, Manchester zu erzeugen wird dich jetzt auch nicht umbringen. So 
aufwändig ist das dann auch wieder nicht. Sieht die SW-Uart von PeDa 
eben ein bischen anders aus. Nicht viel, aber ein bischen anders.

von Ingo (Gast)


Lesenswert?

Gibt's da nicht auch Funkmodule die die normal funktionieren ohne 
Manchester?


Ingo

von Florian T. (florian_t)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Na gut, Manchester zu erzeugen wird dich jetzt auch nicht umbringen. So
> aufwändig ist das dann auch wieder nicht. Sieht die SW-Uart von PeDa
> eben ein bischen anders aus. Nicht viel, aber ein bischen anders.

Also ich scheue mich nicht davor eine Kodierung zu implementieren. Ich 
habe auch keine Probleme mit der Programmierung. Ich habe nur leider 
nicht so viel Erfahrung mit der reinen C-Umgebung in den Tiny/Mega 
Architekturen.

Deshalb frage ich ja auch hier nach euren Erfahrungswerten. Ich habe 
keine Ahnung wieviel Flash ein Programm mit 10, 100 oder 1000 Zeilen 
Code verbrauchen wird. Ich weiß auch nicht genau wieviel RAM das 
Programm dann in Anspruch nehmen wird. Klar, jede Variable verschluckt 
etwas Speicher.

Wenn ich nun aber alle Antworten hier zusammenfasse, scheint es dennoch 
so zu sein, dass ein attiny13 / 15 dafür geeignet zu sein scheint. Auch 
wenn es vielleicht etwas beengt sein mag, und ich aus Bequemlichkeit auf 
vorgefertigte LIBs verzichten muss.

von Karl H. (kbuchegg)


Lesenswert?

Florian Trück schrieb:
> Karl Heinz Buchegger schrieb:
>> Na gut, Manchester zu erzeugen wird dich jetzt auch nicht umbringen. So
>> aufwändig ist das dann auch wieder nicht. Sieht die SW-Uart von PeDa
>> eben ein bischen anders aus. Nicht viel, aber ein bischen anders.
>
> Also ich scheue mich nicht davor eine Kodierung zu implementieren. Ich
> habe auch keine Probleme mit der Programmierung. Ich habe nur leider
> nicht so viel Erfahrung mit der reinen C-Umgebung in den Tiny/Mega
> Architekturen.

Sieh dir Macnhester mal genauer an.
Das ist nicht anderes als eine Flanke genau in der Mitte der Bitzeit zu 
erzeugen. Bei einer zu übertragenden 1 ist es eine steigende Flanke, bei 
einer zu übertragenden 0 ist es eine fallende Flanke (oder ugekehrt, je 
nach deinen Vorlieben)
>
> Deshalb frage ich ja auch hier nach euren Erfahrungswerten. Ich habe
> keine Ahnung wieviel Flash ein Programm mit 10, 100 oder 1000 Zeilen
> Code verbrauchen wird.

Die Anzahl der Zeilen spielt weniger die Rolle. Das was in den Zeilen 
steht, ist es. Manchestercodierung kostet dir ca. 10 bis 15 Befehle auf 
Assemblerebene (großzügig geschätzt). Du hast bei 1k Flash ca 1000 
Befehle zur Verfügung. Noch Fragen?

von Ingo (Gast)


Lesenswert?

Guck doch einfach auf der Atmel Homepage mal nach, ob's noch andere 
Controller mit mehr Speicher und RAM im SO8-W Gehäuse gibt.

Aber grundsätzlich reicht der wohl für n bissel zählen und ausgeben.

Ingo

von ddd (Gast)


Lesenswert?

Florian Trück schrieb:
> Wenn ich nun aber alle Antworten hier zusammenfasse, scheint es dennoch
> so zu sein, dass ein attiny13 / 15 dafür geeignet zu sein scheint. Auch
> wenn es vielleicht etwas beengt sein mag, und ich aus Bequemlichkeit auf
> vorgefertigte LIBs verzichten muss.

OK zum letzten mal, NIMM einen Tiny85 wenn's schon AVR 8pinner sein muß 
!
Du kannst auch in Assembler programmieren wenn's Dir lieber ist ...

von Karl H. (kbuchegg)


Lesenswert?

Ingo schrieb:
> Guck doch einfach auf der Atmel Homepage mal nach, ob's noch andere
> Controller mit mehr Speicher und RAM im SO8-W Gehäuse gibt.

Braucht er doch gar nicht. Speicher hat er mehr als genug.

von Florian T. (florian_t)


Lesenswert?

Ingo schrieb:
> Gibt's da nicht auch Funkmodule die die normal funktionieren ohne
> Manchester?

Mag sein, sogar welche die mit UART gesteuert werden, aber ich wollte 
jetzt eigentlich nicht meinen Geldbeutel leeren, um noch mehr Hardware 
zu kaufen.

Ich mag eigentlich wenn möglich minimalistisch bleiben und so wenig wie 
möglich zukaufen. Das Funkmodul-Set ist mir halt in die Hände gefallen 
und da ich es jetzt habe, wäre es auch sinnvoll es einzusetzen statt 
noch eins zu kaufen.

von Karl H. (kbuchegg)


Lesenswert?

Florian Trück schrieb:

> Ich mag eigentlich wenn möglich minimalistisch bleiben und so wenig wie
> möglich zukaufen. Das Funkmodul-Set ist mir halt in die Hände gefallen
> und da ich es jetzt habe, wäre es auch sinnvoll es einzusetzen statt
> noch eins zu kaufen.

Na dann mach das in Gottes Namen.
Die Schwierigkeit beim Manchester Codieren liegt ja nicht beim Sender, 
sondern darin den Empfänger zu synchronisieren.
Im Sender ist Manchester Pipifax.

von Ingo (Gast)


Lesenswert?

@ Karl Heinz
Warum hast du deinen Manchester-SW-Code wieder rausgenommen, sah auf den 
ersten Blick doch ok aus.

Ingo

von Florian T. (florian_t)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Die Anzahl der Zeilen spielt weniger die Rolle. Das was in den Zeilen
> steht, ist es. Manchestercodierung kostet dir ca. 10 bis 15 Befehle auf
> Assemblerebene (großzügig geschätzt). Du hast bei 1k Flash ca 1000
> Befehle zur Verfügung. Noch Fragen?

Aha, das ist jetzt mal ein Erfahrungswert der mir deutlich weiter hilft. 
:-) Jetzt habe ich mal eine Hausnummer um mich orientieren zu können. 
Also ist es mein Ziel so simpel und minimalistisch wie möglich zu sein, 
um unter dieser Grenze zu bleiben.

von Karl H. (kbuchegg)


Lesenswert?

Florian Trück schrieb:
> Auch
> wenn es vielleicht etwas beengt sein mag, und ich aus Bequemlichkeit auf
> vorgefertigte LIBs verzichten muss.

Du scheinst irgendwie eine völlig falsche Vorstellung zu haben.
Für das was du vorhast, ist der Tiny13 mehr als ausreichend. Wenn du den 
Speichermässig zu 40% auslastest, dann hast du schlecht programmiert.
Die ursprüngliche Empfehlung basierte darauf, dass du dir den Teil 
"Datenübertragung' mit einer UART um Zehnerpotenzen einfacher machen 
kannst (vor allem auf der Empfangsseite) und das für einen Mehrpreis von 
30 oder 40 cent.

von Karl H. (kbuchegg)


Lesenswert?

Florian Trück schrieb:

> Aha, das ist jetzt mal ein Erfahrungswert der mir deutlich weiter hilft.
> :-) Jetzt habe ich mal eine Hausnummer um mich orientieren zu können.
> Also ist es mein Ziel so simpel und minimalistisch wie möglich zu sein,
> um unter dieser Grenze zu bleiben.

Wie kommst du darauf?
Nochmal: du hast 1K Flash zur Verfügung! Das bedeutet so um die 1000 
Befehle. Wenn du in deiner Anwendung geschätzte 300 oder 400 Befehle 
verbrauchst, dann hast du bereits so umständlich wie nur möglich 
programmiert. Ob du jetzt 60 oder 70 Befehle in Summe brauchst, oder gar 
100 - du kriegst von Atmel kein Geld für nicht benutzten Speicher 
zurück.

Speicher ist nicht dein Problem! Nicht bei dieser Anwendung!

von Karl H. (kbuchegg)


Lesenswert?

Ingo schrieb:
> @ Karl Heinz
> Warum hast du deinen Manchester-SW-Code wieder rausgenommen, sah auf den
> ersten Blick doch ok aus.

Weil ich das Startbit nicht bedacht hatte, das man zur 
Takt-Synchronisierung benötigt.

von Florian T. (florian_t)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Du scheinst irgendwie eine völlig falsche Vorstellung zu haben.
> Für das was du vorhast, ist der Tiny13 mehr als ausreichend. Wenn du den
> Speichermässig zu 40% auslastest, dann hast du schlecht programmiert.
> Die ursprüngliche Empfehlung basierte darauf, dass du dir den Teil
> "Datenübertragung' mit einer UART um Zehnerpotenzen einfacher machen
> kannst und das für einen Mehrpreis von 30 oder 40 cent.

OK, leuchtet ein. Aber ich wollte halt mit dem auskommen was da ist. Ich 
werde das Ganze dann nochmal überdenken. Der Grund warum ich einen 
tiny13 nehmen wollte war recht simpel: Er ist minimalistisch, braucht 
nicht viel und vorallem: Ich habe ihn in der Bastelkiste.

Ich habe auch noch andere Atmels in der Bastelkiste, aber meiner Meinung 
nach ist ein Mega16 oder gar 32 dafür vollkommener Overkill.

von Ingo (Gast)


Lesenswert?

Das ist schon fast kein Overkill sondern Dummheit :). Gerade für solche 
Minianwendungen sind die Tinys da. Ich denke mal für das was du brauchst 
reicht sogar ein Tiny10 oder evtl. Sogar der 5er. Aber der kann leider 
nicht in C Programmiert werden, das is dann was für die 
Assemblerleute...


Ingo

von Florian T. (florian_t)


Lesenswert?

Ingo schrieb:
> Das ist schon fast kein Overkill sondern Dummheit :). Gerade für solche
> Minianwendungen sind die Tinys da. Ich denke mal für das was du brauchst
> reicht sogar ein Tiny10 oder evtl. Sogar der 5er. Aber der kann leider
> nicht in C Programmiert werden, das is dann was für die
> Assemblerleute...
>
>
> Ingo


Nun, Assembler ist nicht mein Ding. Ich bleibe da lieber bei dem was ich 
noch verstehen kann. ;-)

von Florian T. (florian_t)


Lesenswert?

Hallo zusammen,
ich danke euch noch einmal für all euer Feedback.
Die Infos waren hilfreich für mich und ermutigen mich, mit dem tiny13 
das ganze umzusetzen.

Eine erste Logik für das Zählen der Impulse habe ich schon entworfen und 
mein Code kompiliert soweit schon einmal Fehlerfrei. Jetzt würde ich 
gerne noch eine Serielle Übertragung implementieren um schon einmal 
erste Daten zu empfangen und auswerten zu können.

@Peter: Das Codeschnippsel ist sehr hilfreich für mich. Aus welcher 
Deiner Libs ist es? Ich würde mir gern noch den Rest davon ansehen um 
weitere Eingebungen zu erhalten.

Viele Grüße und Dank,
Florian

von Hannes L. (hannes)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Nochmal: du hast 1K Flash zur Verfügung! Das bedeutet so um die 1000
> Befehle.

Ich kriege da aber nur 512 Befehle raus, und das auch nur, wenn ich auf 
lds/sts verzichte... ;-)

Xundes Neues aus dem Flachland...

...

von Karl H. (kbuchegg)


Lesenswert?

Hannes Lux schrieb:
> Karl Heinz Buchegger schrieb:
>> Nochmal: du hast 1K Flash zur Verfügung! Das bedeutet so um die 1000
>> Befehle.
>
> Ich kriege da aber nur 512 Befehle raus, und das auch nur, wenn ich auf
> lds/sts verzichte... ;-)

AUtsch.
Ich hab die Word-Architektur verschwitzt.
Danke für die Korrektur.

Allerdings: Auch mit ~500 Befehlen hat er für dieses Projekt mehr Platz 
als er braucht.

>
> Xundes Neues aus dem Flachland...

Detto
(also jetzt nicht aus dem Flachland)

von Florian T. (florian_t)


Lesenswert?

Also bis jetzt sieht es so aus:

AVR Memory Usage
----------------
Device: attiny13

Program:      98 bytes (9.6% Full)
(.text + .data + .bootloader)

Data:         13 bytes (20.3% Full)
(.data + .bss + .noinit)


Build succeeded with 0 Warnings...



Die Logik für das Zählen incl. zweier Variablen von 32 bit Größe habe 
ich schon. So wie das aussieht kann ich da noch jede Menge Zeug 
reinstecken. Wenn ich sparsam bleibe, kann ich sogar noch ein paar 1wire 
Sensoren abfragen und deren Werte gleich über UART mit dazu schicken. 
:-o

von Florian T. (florian_t)


Lesenswert?

Hallo mal wieder,
ich stoße gerade auf ein kleines Problem beim umsetzen meiner Pläne.
Ich entwickle die Software im Atmel Studio 6 was soweit auch super 
funktioniert. Nun simuliere ich den attiny13 mit meinem code und der 
erste Zähler funktioniert soweit gut. Der zweite funktioniert leider 
garnicht.

Ich habe keine Ahnung ob das an meinem Code liegt, oder ob einfach nur 
der Simulator nicht so astrein ist, wie ich es mir dachte. Ich teste 
indem ich im IO view einen PortPin High/Low schalte und mittels 
BreakPoints die Zustände überwache.

Ich habe bisher noch keine entprellung implementiert, also bitte nicht 
deshalb meckern. Da das im Simulator noch nicht von Relevanz ist, sollte 
das also nicht das Problem sein.

Der Code sieht bisher so aus:
1
struct {
2
  unsigned _wind_state:1;
3
  unsigned _rain_state:1;
4
  unsigned _wind_last:1;
5
  unsigned _rain_last:1;
6
} s;
7
8
int main(void) {
9
10
  DDRB &= (0 << DDB0); // PB0 als Eingang
11
  DDRB &= (0 << DDB1); // PB1 als Eingang
12
  DDRB |= (1 << DDB4);  // PB4 als Ausgang
13
14
  while(1) {
15
    s._wind_state = PINB & (1<<PINB0);
16
    s._rain_state = PINB & (1<<PINB1);
17
    
18
    if (s._wind_state != s._wind_last) {
19
      if(s._wind_state == 1) {
20
        _counter_wind ++;
21
      }      
22
      s._wind_last = s._wind_state;
23
    }
24
25
    if (s._rain_state != s._rain_last) {
26
      if(s._rain_state == 1) {
27
        _counter_rain ++;
28
      }      
29
      s._rain_last = s._rain_state;
30
    }
31
  }
32
33
  return 0;
34
}

Hat jemand eine zündende Idee warum PB0 soweit funktioniert, aber PB1 
nicht?

von Peter D. (peda)


Lesenswert?

Bits sind nur bei 1 wahr, daher:
1
    s._rain_state = !!(PINB & (1<<PINB1));

Diese ganze Bitterei kostet Dich richtig viel Code.
Wenn möglich sollte man auch für Bits besser ein uint8_t nehmen.


Peter

von Florian T. (florian_t)


Lesenswert?

Peter Dannegger schrieb:
> Bits sind nur bei 1 wahr, daher:    s._rain_state = !!(PINB & (1<<PINB1));

Ich habe gerade Mühe den Codeschnippsel zu verstehen. Ist das eine 
doppelte inversion? Ich frage mich, warum es dann bei der ersten 
Variable funktioniert.

Peter Dannegger schrieb:
> Diese ganze Bitterei kostet Dich richtig viel Code.
> Wenn möglich sollte man auch für Bits besser ein uint8_t nehmen.

Ich habe bisher keinen nennenswerten Unterschied in der Größe 
feststellen können, aber ich werde es gern beherzigen.
Was mir allerdings gerade auffällt: Im AVR Studio 4 ist nach dem 
Kompilieren der Code 104 Bytes groß, im Studio 6 ist er 312 Bytes. Ist 
der neue Kompiler nicht so gut in der optimierung?

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.