Forum: Projekte & Code DS18B20 mit Interrupt, AVR-GCC


von Peter D. (peda)


Angehängte Dateien:

Lesenswert?

Die 1-Wire Sensoren auslesen dauert ja schon recht lange und kann die 
Mainloop merkbar verzögern. Daher habe ich mal meinen alten C51-Code auf 
AVR-GCC portiert und noch etwas aufgehübscht.
Es wird eine Statemaschine im Timerinterrupt verwendet. Die 
Statemaschine macht einen kompletten 1-Wire Transfer und stoppt dann den 
Timer wieder. Man kann also in der Mainloop eine Aktion starten und 
zyklisch abfragen, ob sie fertig ist. Die Mainloop wird also nicht 
ausgebremst und kann in der Zwischenzeit andere Tasks ausführen.

Damit nicht andere Interrupts das 1-Wire Timing zerstören, werden die 
kurzen Aktionen im Timerinterrupt abgewartet. Dadurch benötigt der 
Interrupthandler etwa 6µs.
Damit die max 120µs des Low-Pulses eingehalten werden, dürfen andere 
Interrupts nur um max 60µs verzögern. Ansonsten müssen diese Handler die 
Interrupts wieder freigeben.

Bequemer Weise macht die Statemaschine auch gleich die Wartezeit für die 
Wandlung mit. Sie läßt sich in 0,1s Schritten bis max 25s wählen.
Wenn man die Sensoren nicht mit parasite Power versorgen will, kann man 
die entsprechenden Zeilen auskommentieren (Zeile 100, 101).

Anbei der komplette Code.
Hier die Statemaschine:
1
ISR(TIMER0_OVF_vect)
2
{
3
  if (ONWI_oe && !ONWI_out)             // if low
4
  {
5
    ONWI_oe = 0;                        // pin = tristate
6
    _delay_us(5);                       // min high time
7
  }
8
  uint8_t* pbuf = onwi.pbuf;            // for faster access
9
  switch (++onwi.state)
10
  {
11
    case OW_RES_LO:                     // 480us low
12
      if (onwi.delay--)                 // n * 100ms
13
        onwi.state = OW_DELAY;
14
      else
15
      {
16
        ONWI_out = 0;
17
        ONWI_oe = 1;                    // pin = low
18
      }
19
    case OW_RES_HI:                     // 480us high
20
    default:                            // n * 480µs
21
      TCNT0 = 256 - OW_RESET_SLOT;
22
      return;
23
    case OW_WR_DONE:                    // 1. command byte finished
24
      pbuf++;
25
      onwi.state = OW_WR_BIT0;
26
    case OW_WR_BIT0:                    // write bit 0
27
      if (onwi.wr_cnt--)
28
      {
29
    case OW_WR_BIT1:                    // write bit 1
30
    case OW_WR_BIT2:
31
    case OW_WR_BIT3:
32
    case OW_WR_BIT4:
33
    case OW_WR_BIT5:
34
    case OW_WR_BIT6:
35
    case OW_WR_BIT7:                    // write bit 7
36
        ONWI_oe = 1;                    // pin = low
37
        _delay_us(1);
38
        if (*pbuf & 1)
39
          ONWI_oe = 0;                  // pin = tristate
40
        *pbuf >>= 1;
41
        break;
42
      }
43
      ONWI_out = 1;                     // parasite power on
44
      ONWI_oe = 1;
45
      pbuf = onwi.buf - 1;
46
    case OW_RD_DONE:
47
      pbuf++;
48
      onwi.state = OW_RD_BIT0;
49
      if (onwi.rd_cnt--)
50
      {
51
        ONWI_oe = 0;                    // parasite power off
52
        ONWI_out = 0;
53
    case OW_RD_BIT1:                    // read bit 1
54
    case OW_RD_BIT2:
55
    case OW_RD_BIT3:
56
    case OW_RD_BIT4:
57
    case OW_RD_BIT5:
58
    case OW_RD_BIT6:
59
    case OW_RD_BIT7:                    // read bit 7
60
        ONWI_oe = 1;                    // pin = low
61
        _delay_us(1);
62
        ONWI_oe = 0;                    // pin = tristate
63
        _delay_us(5);
64
        *pbuf >>= 1;
65
        if (ONWI_in)
66
          *pbuf |= 0x80;
67
        break;
68
      }
69
      TCCR0B = 0;                       // stop T0
70
      return;
71
  }
72
  onwi.pbuf = pbuf;
73
  TCNT0 = 256 - OW_BIT_SLOT;
74
}

: Bearbeitet durch User
von Carl D. (jcw2)


Lesenswert?

ein echter Dannegger!

Trickreich wie die Entprellung.

Danke Peter!

von Peter D. (peda)


Lesenswert?

Carl D. schrieb:
> Trickreich wie die Entprellung.

Der Trick ist einfach nur der, daß ich nicht schnell mal eben so 
drauflos einhacke, sondern erstmal einen Plan mache.
Ich empfehle dafür die gute alte Papier, Bleistift, Radiergummi Methode.

Auch mag ich es nicht, wenn man gleiche Codesequenzen an mehreren 
Stellen wiederholen muß. Zu oft macht man dann Fehler, wenn Änderungen 
nötig sind und man Stellen vergißt, zu ändern. An sowas haben vermutlich 
die C-Entwickler gedacht und deshalb das Durchrutschen durch case 
explizit vorgesehen.
Vom Prinzip her ist das switch/case einfach nur eine spezielle Version 
des goto.
Von Pointern eine lokale Arbeitskopie anzulegen, hilft dem Compiler beim 
Optimieren sehr.

Die States beim 1-Wire sind schön aufeinander folgend. Es sind nur 3 
Rücksprünge nötig, für die Meßzeit und für das nächstes Byte schreiben 
oder lesen.

von Carl D. (jcw2)


Lesenswert?

Hallo Peter,
"trickreich" war nicht als Vorwurf, sondern als Kompliment gemeint.
Es hat auch etwas gedauert, bis ich das mit dem Delay verstanden hab ;-)
Wie gesagt: Danke für den von dir veröffentlichen Code!

von HansImGlück (Gast)


Lesenswert?

hi, ich habe es noch etwas weiter "getrieben":

- fsm mit timer isr und sleep mode
- statt fsm mit timer isr eine fsm mit watchdog delays

von Mathias W. (mathias_w)


Lesenswert?

HansImGlück schrieb:
> hi, ich habe es noch etwas weiter "getrieben":
>
> - fsm mit timer isr und sleep mode

Da hast du vermutlich in der main nur sleep aufgerufen. Oder worin 
unterscheidet sie sich sonst von Peters FSM?

> - statt fsm mit timer isr eine fsm mit watchdog delays

Magst du das auch hier veröffentlichen? Das fände ich toll und 
hilfreich!

von HansImGlück (Gast)


Lesenswert?

Peter D. schrieb:
> Damit nicht andere Interrupts das 1-Wire Timing zerstören, werden die
> kurzen Aktionen im Timerinterrupt abgewartet

Gewartet wird bei meiner Realisierung im Sleep Mode und der Timer macht 
das Wake-up!

Mathias W. schrieb:
> Da hast du vermutlich in der main nur sleep aufgerufen. Oder worin
> unterscheidet sie sich sonst von Peters FSM?

Bei der zweiten Variante wurde die Timer Funktion durch den Watchdog 
realisiert, also wieder warten im Sleep Mode, aber Wake-up durch den 
Watchdog!

Der Unterschied besteht darin, das der Watchdog Timer nochmals viel 
weniger Power Consumption im Sleep bedeutet, da die Taktquelle maximal 
low-power ist.
... alles zum Preis, dass der WD weniger genaue Zeitintervalle hat, was 
hier ohne Bedeutung ist.

Auch realisiere ich oft beliebeige Delays im Sleep Mode mit dem 
Watchdog, durch Kombination von mehrenen WD-Zeitintervalen, da dieser ja 
nur wenige/feste Zeitintervalle bietet.

Mathias W. schrieb:
> Magst du das auch hier veröffentlichen? Das fände ich toll und
> hilfreich!

Muss ich mir überlegen ... eigentlich nicht, weil leider das technische 
Niveau sowie das Diskussionsniveau hier oft so grausam niedrig ist, dass 
die Arbeit dazu nicht lohnenswert erscheint.


Dieses Forum ist bespiellos bzgl. HW/SW/Engineering low Level QA!
Leider of echt wenig addded value, mit Ausnahmen wie Steccy, 
Taschenrechner 1284p ...

Schaut euch doch mal an z.B. den Code der WordClock oder vom 
Transistortester - ja echt viel Fleiß, aber genau nur das! Ansonsten 
eine grausame Quality bzgl. Strukture/Design/Sprachanwendung/...

von Zeno (Gast)


Lesenswert?

HansImGlück schrieb:
> Mathias W. schrieb:
>> Magst du das auch hier veröffentlichen? Das fände ich toll und
>> hilfreich!
>
> Muss ich mir überlegen ... eigentlich nicht, weil leider das technische
> Niveau sowie das Diskussionsniveau hier oft so grausam niedrig ist, dass
> die Arbeit dazu nicht lohnenswert erscheint.
>
> Dieses Forum ist bespiellos bzgl. HW/SW/Engineering low Level QA!
> Leider of echt wenig addded value, mit Ausnahmen wie Steccy,
> Taschenrechner 1284p ...
>
> Schaut euch doch mal an z.B. den Code der WordClock oder vom
> Transistortester - ja echt viel Fleiß, aber genau nur das! Ansonsten
> eine grausame Quality bzgl. Strukture/Design/Sprachanwendung/...

Ja das Niveau ist manchmal nicht so dolle hier. Dennoch verstehe ich 
Deine Einlassung nicht.
Wenn Du findest das die Qualität des Quellcodes hier zu schlecht ist, 
dann wäre es doch an der Zeit mal zu zeigen wie man es besser macht. 
Allerdings läßt sich das nur beurteilen wenn Du Deinen Code hier zeigst. 
Behaupten das der eigene Code viel besser ist kann jeder. Bis jetzt ist 
Deine Aussage nur heiße Luft.
Im übrigen ist es kein guter Stil den Leuten hier den Mund wässrig zu 
machen und dann den Code zurückzuhalten. Das läßt eigentlich nur einen 
Schluß zu : Dein Code ist nicht so gut wie Du behauptest. Beweise es 
ansonsten wäre es besser die Griffel still zu halten.
Bei Deiner Einstellung wäre es besser, wenn Du hier auf jegliche Posts 
verzichten würdest, denn im Gegensatz zu Peda hilfst Du hier niemanden.

von HansImGlück (Gast)


Lesenswert?

Zeno schrieb:
> Im übrigen ist es kein guter Stil den Leuten hier den Mund wässrig zu
> machen und dann den Code zurückzuhalten. Das läßt eigentlich nur einen
> Schluß zu : Dein Code ist nicht so gut wie Du behauptest. Beweise es
> ansonsten wäre es besser die Griffel still zu halten.

Ich sagte doch schon low Level!
Deine Anwendung von logischen Denkgesetzen ist eher sehr bescheiden und 
augenscheinlich unlogisch, weil weder induktiv noch deduktiv begründet 
und auch nicht falsifizierend. Dafür aber passend zum vorherrschenden 
Klippschulniveau.

Unter Hilfe verstehe ich eher Selbsthilfe und nicht Copy&Paste.
Mit meinen Hinweisen sollte jeder Normalbegabte es selber realiseren 
können und die anderen brauchen das auch nicht wirklch, weil sie es dann 
offensichtlich auch nicht verstanden haben.

Klippschule unterstütze ich nicht, dazu gibt es hier genug andere 
Helden, wie du so einer bist.

von c-hater (Gast)


Lesenswert?

Peter D. schrieb:

> Anbei der komplette Code.

Sehr schöner Code für die "universelle" Form (universell hier im Sinne 
von: für einen möglichst breiten Bereich von Systemtakten geeignet). Das 
geht kaum besser umzusetzen.

Aber sowohl für besonders hohe auch auch für besonders geringe 
Systemtakte gibt es natürlich deutliches Optimierungspotential. Das ist 
halt der Fluch der Universalität...

Was soll's, bei jedem Code muss man Kompromisse machen, je nach 
Zielstellung.

von Veit D. (devil-elec)


Lesenswert?

@ Peter:
Bienchen für den Code.

@ c-hater:
Bienchen für die Sachlichkeit. Macht ja sonst niemand.  :-)

von Moritz (Gast)


Lesenswert?

Ohne Worte - Du bist der lebende Beweis für das linke Ende der 
Gauß-Kurve beim Thema Intelligenz.

von Wilhelm M. (wimalopaan)


Lesenswert?

Kommt mir fast so vor, als hätten c-hater und HansImGlück die NichNames 
getauscht ;-)

von Zeigefinger (Gast)


Lesenswert?

Moritz schrieb:
> Ohne Worte - Du bist der lebende Beweis für das linke Ende der
> Gauß-Kurve beim Thema Intelligenz.

Hi Kleingeist, du offenbarst hier einen Wiederspruch, weil das linke 
Ende der Gauß-Kurve ist immer bei Null und mit "Null-Intelligenz" ist 
kein biologisches System lebensfähig. Daher ist dort auch kein lebender 
Beweis zu erbringen!

von Wilhelm M. (wimalopaan)


Lesenswert?

Zeigefinger schrieb:
> weil das linke
> Ende der Gauß-Kurve ist immer bei Null

hört, hört

von Zeigefinger (Gast)


Lesenswert?

Wilhelm M. schrieb:
> hört, hört

Kannst du offensichtlich nicht begreifen, da kein Mathe Abiturlevel dir 
zu eigen ist. Und wenn doch, dann haste wohl nur am Fenster gesessen!

Infinitialrechnung schon mal berührt?
Bleib lieber bei deinen 4 Grundrechenarten, das reicht für eine 
bescheidene Existenz.

von Zeno (Gast)


Lesenswert?

HansImGlück schrieb:
> Ich sagte doch schon low Level!
> Deine Anwendung von logischen Denkgesetzen ist eher sehr bescheiden und
> augenscheinlich unlogisch, weil weder induktiv noch deduktiv begründet
> und auch nicht falsifizierend. Dafür aber passend zum vorherrschenden
> Klippschulniveau.
Ja mir ist schon klar, das Du hier den meisten und insbesondere mir 
völlig überlegen bist.

HansImGlück schrieb:
> Unter Hilfe verstehe ich eher Selbsthilfe und nicht Copy&Paste.
> Mit meinen Hinweisen sollte jeder Normalbegabte es selber realiseren
> können und die anderen brauchen das auch nicht wirklch, weil sie es dann
> offensichtlich auch nicht verstanden haben.
Nicht mal daran gedacht das es auch Leute gibt die das vielleicht nicht 
jeden Tag machen und deshalb nicht so viel Erfahrung haben? Das da viele 
dabei sein werden denen Deine Ausführungen nicht weiter helfen, einfach 
weil die Erfahrung und das Wissen fehlt? Den Quelltext vor Augen kann 
man sich da oftmals viel einfacher rein denken.
Und ja es wir immer Leute geben die dann C&P machen, aber es wird genau 
so viele Leute geben, die versuchen werden Deine Gedanken nach zu 
vollziehen, diese als Anregung aufnehmen und dann ihren eigenen Weg 
gehen.
Ich habe mir für meine Wetterstation auch eine 1-W Implementierung 
geschrieben. Die ist zwar bei weitem nicht so durchdacht wie die Lösung 
von Peda oder Deine, aber ich habe sie selbst gemacht und verstanden. 
Und das ist für mich das Entscheidente, denn das Ganze muß ja auch 
gewartet werden.
Ich werde jetzt auch nicht hergehen und Pedas Lösung implementieren auch 
nicht per C&P, aber ich habe sie mir mit Interesse angesehen und etwas 
dabei gelernt.

Ich niemanden was Schlechtes, aber bei Dir kann ich nur sagen Hochmut 
kommt vor dem Fall. Ich weis schon, warum ich solchen Zeitgenossen wie 
Du einer zu sein scheinst lieber aus dem Weg gehe.

von Zeno (Gast)


Lesenswert?

Zeno schrieb:
> Ich niemanden was Schlechtes, aber bei Dir kann ich nur sagen Hochmut
> kommt vor dem Fall. Ich weis schon, warum ich solchen Zeitgenossen wie
> Du einer zu sein scheinst lieber aus dem Weg gehe.
Korrektur:
Ich wünsche niemanden was Schlechtes, aber bei Dir kann ich nur sagen 
Hochmut
kommt vor dem Fall. Ich weis schon, warum ich solchen Zeitgenossen wie
Du einer zu sein scheinst lieber aus dem Weg gehe.

von Wilhelm M. (wimalopaan)


Lesenswert?

Zeigefinger schrieb:
> Kannst du offensichtlich nicht begreifen, da kein Mathe Abiturlevel dir
> zu eigen ist. Und wenn doch, dann haste wohl nur am Fenster gesessen!

Kleine Nachfrage dann noch: bitte kläre mich auf!

Wo ist das linke Ende der Gaußkurve?

Beitrag #6238066 wurde von einem Moderator gelöscht.
Beitrag #6238099 wurde von einem Moderator gelöscht.
Beitrag #6238130 wurde von einem Moderator gelöscht.
Beitrag #6238164 wurde von einem Moderator gelöscht.
von Peter D. (peda)


Lesenswert?

HansImGlück schrieb:
> - fsm mit timer isr und sleep mode
> - statt fsm mit timer isr eine fsm mit watchdog delays

Falls Stromsparen notwendig ist, dann macht das die Mainloop, denn nur 
die weiß, ob noch andere Tasks auszuführen sind. Eine Device-Lib hat 
sich da gefälligst raus zu halten. Sie sollte so wenig Seiteneffekte wie 
möglich haben. Und unerwünscht in Sleep zu gehen, ist schon eine massive 
Beeinträchtigung.
Ganz abgesehen davon ist Sleep in Interrupts beim AVR ein Kapitel für 
sich.

von HansImGlück (Gast)


Lesenswert?

Peter D. schrieb:
> Und unerwünscht in Sleep zu gehen, ist schon eine massive
> Beeinträchtigung.

... hier spricht ja ein richtiger Experte?! - eher wohl nur ein selbst 
ernannter!

Peter D. schrieb:
> Statemaschine auch gleich die Wartezeit

Nur die Wartezeiten im Device Treiber werden bei mir jetzt im sleep 
erledigt und somit gibt es auch keine Seiteneffekte, die nicht schon 
vorher da waren.

Sleep mode in einer ISR ist kein Spezialfall ausser für jene die auf 
einen 8051 fahren gelernt haben und aus der Vergangenheit in die Zukunft 
reisen!

Da der Experte schon mal in der Leitung ist ..., es wäre nützlich mal 
das Statediagramm seiner FSM zu sehen. Damit mal überprüft werden kann, 
ob auch das liefert wird was versprochen wird - ein vollständiges 
OneWire Protokoll!

von Carl D. (jcw2)


Lesenswert?

HansImGlück schrieb:
>
> Da der Experte schon mal in der Leitung ist ..., es wäre nützlich mal
> das Statediagramm seiner FSM zu sehen. Damit mal überprüft werden kann,
> ob auch das liefert wird was versprochen wird - ein vollständiges
> OneWire Protokoll!

Warum sollte er das tun?

@Admin: Bitte aufräumen. Danke!

von Lolita (Gast)


Lesenswert?

@Freaks, bitte, macht euch doch nicht
wieder gegenseitig runter... ;-O

Der Peter ist doch ein guter Schriftsteller!

Ich hab da mal ne kleine OT-Frage:
Was haltet ihr von IAR Visualstate?
Lohnt es, sich damit zu beschäftigen,
oder kann es weg?

mfg

von Nabokov (Gast)


Lesenswert?

Lolita schrieb:

> Der Peter ist doch ein guter Schriftsteller!

Besser wäre ein guter Programmierer.

von Lolita (Gast)


Lesenswert?

Nabokov meinte:

> Besser wäre ein guter Programmierer.
Bähh! ;-P
ist das nicht das Selbe? ;-O
PeDa macht doch Märchen wahr!

mfg

von Lolita (Gast)


Lesenswert?

Oh,
Was hat den frau nun wieder angestellt! ;-O
Hier darf frau ja keine Fragen stellen!
Sorry!!! ;--O

@Amin, die Brü...äh Löschtste gehört Dir!


mfg

von Zeno (Gast)


Lesenswert?

Lolita schrieb:
> @Freaks, bitte, macht euch doch nicht
> wieder gegenseitig runter... ;-O
>
> Der Peter ist doch ein guter Schriftsteller!

Ach Lolita gegen den Peter geht es doch gar nicht. Alle hier im Forum 
wissen das der Peter sich alles gut überlegt und guten Code schreibt.
Er ist sich auch nicht zu fein sein Wissen mit der Community hier zu 
teilen.

Aber es gibt Leute hier in diesem Thread die meinen sie wären der 
Herrgott höchstselbst und benehmen sich auch entsprechend.
Aber wahrscheinlich ist sein Code doch nicht so gut wie Peter hier 
Beitrag "Re: DS18B20 mit Interrupt, AVR-GCC" schreibt. 
Ich kann es nicht beurteilen da ich weder den tollen Code kenne noch der 
absolute AVR Programmierguru bin. Ich mache das nur für den 
Hausgebrauch, sicher nicht optimal aber für mich völlig ausreichend, da 
für meine Zwecke am Ende die zu erledigende Funktionalität das Ziel ist. 
Das Ganze muß auch nicht sonderlich performant sein, solange die 
gewünschte Funktion erfüllt wird.

von Lolita (Gast)


Lesenswert?

@zeno,

Wenn Du aber kostenlos ein schelles und gutes Protokoll
bekommst, warum willst du dann ein langsames einsetzen?

So bleibt doch mehr Zeit für eigene Ergüsse übrig?
Der Speicher ist doch bestimmt nur ein Teil deine Projektes
oder die Hauptsache?

mfg

von Lolita (Gast)


Lesenswert?

Naja, ich beantworte die Fragen mir mal selber:

Schön wäre es, wenn wir Liebenden (Amateure) uns hier
Librarys schaffen könnten, die von den Hasen begutachtet,
einen MC_Net Standard auch außerhalb des Boardes schaffen könnten.

Ich hätte sogar nen Vorschlag für die Licence:

Jeder der das Zeug dann einsetzt, hat einen constexpr string
im Kompilat zu plazieren, etwa:

www.mc.net absolut easy!

oder auch

www.mc.net nicht mit mir!  ;-P


mfg

von Zeno (Gast)


Lesenswert?

Lolita schrieb:
> Wenn Du aber kostenlos ein schelles und gutes Protokoll
> bekommst, warum willst du dann ein langsames einsetzen?
>
> So bleibt doch mehr Zeit für eigene Ergüsse übrig?
> Der Speicher ist doch bestimmt nur ein Teil deine Projektes
> oder die Hauptsache?

Ich habe mich seinerzeit als ich das gemacht habe halt auch umgeschaut 
wie man den 1-Wire Bus mit einem µC anspricht. Ich bin dann auch fündig 
geworden und habe die Lösung an mein Projekt angepasst - ich verwende 
einen MSP430. Diese Lösung arbeitet halt ohne Interrupts und macht die 
Timings mit einer Delayfunktion. Ja das ist sich nicht elegant und auch 
nicht sonderlich schnell, aber für meine Wetterstation ist das völlig 
zweitrangig, weil da die Abfrageintervalle in aller Regel größer als 30s 
sind - Wetter ändert sich halt nicht so schnell. Besonders 
energieeffizient muß es auch nicht sein, da die Wetterstation mit 
Netzteil versorgt wird.
Mir kam es da wirklich nur auf eine funktionierende Lösung an die ich 
auch verstehe. Interupts sind mir immer noch ein wenig suspekt - ich 
gewöhne mich halt sehr langsam daran. Für mich ist das ganze eben nur 
Hobby und mit µC hantiere ich auch erst seit vielleicht 8 Jahren. Bin 
vorher eben ganz gut mehr als 40Jahre ohne µC ausgekommen.

Zum 2.Teil Deines Posts. Na klar würde dann mehr Zeit für eigene Ergüsse 
bleiben, aber man lernt eben mehr, wenn man ein Problem selber löst, 
auch wenn die Lösung nicht optimal ist. Beim nächsten Mal macht man es 
eben besser. Es mach auch mehr Spaß, wenn man selbst eine Lösung findet 
und für's Ego ist es auch gut.

Lolita schrieb:
> Jeder der das Zeug dann einsetzt, hat einen constexpr string
> im Kompilat zu plazieren, etwa:
Das mach ich generell so. In meinem Quelltexten ist immer ein Verweis 
auf die Quelle, wenn ich fremden Code benutzt habe. In dem Programm 
welches ich für meine Firma geschrieben habe, sind z.B die Quellen aller 
Fremdkomponenten/-code in einer Aboutbox aufgeführt.

von HansImGlück (Gast)


Lesenswert?

Peter D. schrieb:
> AVR-GCC portiert und noch etwas aufgehübscht.

... das geht noch viel optimaler bzgl. Speed/Size, wenn man die AVR 
Architekture besser kennt und für die FSM states(or partly) diese auf 
die GPR Register linkt!

meine Geheimwaffe!
GPR?, liegen im IO Memory Addressbereich und sind Bit addressierbar 
toogle/clear/set/read, sprich kein read-modify-write nötig und HW 
initialisiert! Es gibt so GPR0 bis 3/4 und mal genannt GPIORx oder GPRx.

Wer von euch Helden kennt diese UND kann sie auch sinnvoll benutzen für 
z.B. Flags/States/Schleifenvariable?

Wie verwenden? z.B. so, status= bit flag

typedef struct {
  uint8_t status1 :1, status2 :1, ... ;
} status_t;

#define STATUS1 ((status_t*) &GPIOR0)->status1
#define STATUS2 ((status_t*) &GPIOR0)->status2

von Carl D. (jcw2)


Lesenswert?

HansImGlück schrieb:
> Peter D. schrieb:
>> AVR-GCC portiert und noch etwas aufgehübscht.
>
> ... das geht noch viel optimaler bzgl. Speed/Size, wenn man die AVR
> Architekture besser kennt und für die FSM states(or partly) diese auf
> die GPR Register linkt!
>
> meine Geheimwaffe!
> GPR?, liegen im IO Memory Addressbereich und sind Bit addressierbar
> toogle/clear/set/read, sprich kein read-modify-write nötig und HW
> initialisiert! Es gibt so GPR0 bis 3/4 und mal genannt GPIORx oder GPRx.
>
> Wer von euch Helden kennt diese UND kann sie auch
> sinnvoll benutzen für z.B. Flags/States/Schleifenvariablen

Schön daß du das entdeckt hast. Damit bist du nun AVR-Experte. Mit gutem 
Algorithmus hat das so viel zu tun wie der Tip von einigen, nur ASM ist 
gut.

BTW, Schleifenvariablen in GPRx ist ziemlicher Müll, den man aber nur 
versteht, wenn man schon mal eine Schleife im Assemblerlisting gesehen 
hat und das AVR8 Programmiermodell versteht.

von Peter D. (peda)


Lesenswert?

HansImGlück schrieb:
> meine Geheimwaffe!

Daß ich nicht lache.
Zu meinem Programmierstil gehört eben, daß ich Programme möglichst 
unabhängig vom konkreten Target halten will.
Wenn der Compiler bool durch HW-Bits ersetzen würde, dann hätte ich 
nichts dagegen. Aber selber werde ich nen Teufel tun und den Code 
zusätzlich unleserlich gestalten. Aus dem gleichen Grund benutze ich 
auch nicht die Togglefunktion mancher AVR-Targets über die 
Inputregister.
Die Einsparungen durch solchen Hassle sind nicht der Rede wert.

von c-hater (Gast)


Lesenswert?

Peter D. schrieb:

> Zu meinem Programmierstil gehört eben, daß ich Programme möglichst
> unabhängig vom konkreten Target halten will.

Was natürlich zur Folge hat, dass sie für ein konkretes Target oft 
suboptimal sind. Solange kein Problem, wie die Resourcen trotzdem für 
die Aufgabe genügen.

Aber was, wenn nicht?

> Wenn der Compiler bool durch HW-Bits ersetzen würde, dann hätte ich
> nichts dagegen. Aber selber werde ich nen Teufel tun und den Code
> zusätzlich unleserlich gestalten. Aus dem gleichen Grund benutze ich
> auch nicht die Togglefunktion mancher AVR-Targets über die
> Inputregister.

Dann benutzt du also nach der gleichen Logik auch kein Eventsystem, kein 
ADC, kein Timer2, keine I2C-/SPI-Hardware (...Aufzählung beliebig 
erweiterbar)?

All diese netten Sachen gibt's nämlich halt nicht auf jedem AVR8. 
Deswegen sollte man sie deiner Meinung nach überhaupt nie verwenden?

Also mir scheint: das kann nur falsch sein...

> Die Einsparungen durch solchen Hassle sind nicht der Rede wert.

Das kommt ja wohl sehr darauf an...

von HansImGlück (Gast)


Lesenswert?

Peter D. schrieb:
> Die Einsparungen durch solchen Hassle sind nicht der Rede wert.

Du Dümmerchen, die Einsparung ist signifikant, probiert es mal aus.

Peter D. schrieb:
> Aus dem gleichen Grund benutze ich
> auch nicht die Togglefunktion mancher AVR-Targets

Ich schon, die Togglefunktion hat quasi jeder AVR und auch die GPR's!
Du schreibst doch hier, dass du für AVR den Code portiert hast, daher 
sehr inkonsequent dein Statement, - wohl doch eher ein Kleingeist?!

BTW, viele neue AVR unterstützen OneWire via HW UART mode, aber das ist 
auch nichts für deinen Programmierstile, so wenig wie reduction of power 
consumption, wohl einfach zu alt und unflexibel der Herr.

Peter D. schrieb:
> Aber selber werde ich nen Teufel tun und den Code
> zusätzlich unleserlich gestalten.

Echt dumm dein Gelaber, die GPR's lassen sich via union genau so 
ansprechen, wie jedes andere SFR angesprochen wird und wie 
Atmel/Microchip es in ihren header files definieren.
Sind diese auch für dich zu unleserlich, dann liegt es vielleicht doch 
nur an den eigenen begrenzten Fähigkeiten.

Ich würde erst mal prüfen/verifizieren und dann mir eine Meinung bilden, 
so macht es jeder durchschnittliche Ingenieur.

von HansImGlück (Gast)


Lesenswert?

c-hater schrieb:
> All diese netten Sachen gibt's nämlich halt nicht auf jedem AVR8.

AVR8 was ist das, muss ich das noch kennen?
... ch bekomme von Microchip jeden Monat backfrisch 36 AVR/ARM/PIC's 
freihaus geliefert und sammle die Teile bald wie Briefmarken!
... und lese auch intensive die Doku's, und mag sehr das Eventsystem, 
und die Cortex M23 und PIC32 Serie,
... und "liebe" Micropython, das wäre dann auch für den c-hater 
vielleicht was, oder?!
... lässt sich auch mit c/c++ verheiraten!

von Zeno (Gast)


Lesenswert?

HansImGlück schrieb:
> Wer von euch Helden kennt diese UND kann sie auch sinnvoll benutzen für
> z.B. Flags/States/Schleifenvariable?

HansImGlück schrieb:
> Du Dümmerchen, die Einsparung ist signifikant, probiert es mal aus.

HansImGlück schrieb:
> Sind diese auch für dich zu unleserlich, dann liegt es vielleicht doch
> nur an den eigenen begrenzten Fähigkeiten.

HansImGlück schrieb:
> AVR8 was ist das, muss ich das noch kennen?
> ... ch bekomme von Microchip jeden Monat backfrisch 36 AVR/ARM/PIC's
> freihaus geliefert und sammle die Teile bald wie Briefmarken!
> ... und lese auch intensive die Doku's, und mag sehr das Eventsystem,
> und die Cortex M23 und PIC32 Serie,
> ... und "liebe" Micropython, das wäre dann auch für den c-hater
> vielleicht was, oder?!
> ... lässt sich auch mit c/c++ verheiraten!

Man trägst Du die Nase hoch! Du solltest sie mal wieder runter nehmen, 
damit das Regenwasser raus laufen kann und Du wieder Luft durch die Nase 
bekommst, denn das ist viel gesünder und beugt Schnappatmung vor.

von Carl D. (jcw2)


Lesenswert?

Leute, der Typ, der umständlich einen Goldklumpem im Brunnen versenkt 
hat, hat nur etwas Lagerkoller, weil er aktuell keine Börger essen gehen 
darf. Da stichelt man halt mal in jede Richtung und hofft auf 
Unterhaltung. Einfach stehen lassen.

von Zeno (Gast)


Lesenswert?

Carl D. schrieb:
> Einfach stehen lassen.

Ist sehr wahrscheinlich die beste Lösung.

von HandHochHier (Gast)


Lesenswert?

Zeno schrieb:
> Ist sehr wahrscheinlich die beste Lösung.

Interessant, euch interessiert nicht der Inhalt sondern nur die 
Verpackung, da hatte HansImGlück schon recht, wenn er das miese Niveau 
hier anprangert!

Der Typ wirft mal wenigstens ein paar Argumente in den Ring, daran könnt 
ihr euch doch mal versuchen und abarbeiten!

Ach neh doch nicht, richtig arbeiten will oder kann ja hier keiner mehr, 
lieber nur rumhängen und copy&past?!

von Peter D. (peda)


Lesenswert?

HansImGlück schrieb:
> Du Dümmerchen, die Einsparung ist signifikant, probiert es mal aus.

Nö, signifikant ist da nichts. Der User würde es nicht merken und 
nichtmal messen können, da die zeitrelevanten Tasks davon nicht 
betroffen wären.
Warum also sollte ich Programmierzeit in Mikrooptimierung verschwenden, 
wenn es nicht das geringste bringt?
Meine AVR-Anwendungen haben reichlich Reserven und laufen auch nicht bei 
der maximalen F_CPU.

von Zeno (Gast)


Lesenswert?

HandHochHier schrieb:
> Interessant, euch interessiert nicht der Inhalt sondern nur die
> Verpackung,  ...
Noch so'n Schlauberger.

von Chris (chris-heo)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

da ich mehrere DS18B20 gleichzeitig auslesen wollte, habe ich Peters 
Code etwas umgebaut und erweitert. Die Zugriffe auf die IOs sind 
extrahiert, was auch die Portierung auf andere MCUs erleichtern dürfte 
(in meinem Fall auf einen Tiny1616), auch lassen sich die Pins des 
verwendeten Ports über ONEWIRE_PINMASK einschränken.

Die Methoden zum Auslesen der DS18B20 ist in eine extra Datei gewandert 
und mit einer kleinen Statemachine ist das Auslesen der Sensoren etwas 
bequemer.

ds18b20_start() startet eine conversion, ds18b20_tick() kann nach 
belieben aufgerufen werden - diese gibt, wie ds18b20_isdone() zurück, ob 
eine conversion abgeschlossen ist. Mit ds18b20_get_temp_fixe() kann die 
Temperatur des angegebenen Kanals als fixed-point zurückgegeben werden.

Ich verwende den Code in einem Modbus-Server, funktioniert auf dem 
Basteltisch bisher ausgezeichnet.

@peda: welche Lizenz hat dein Code eigentlich?

von Peter D. (peda)


Lesenswert?

Chris schrieb:
> @peda: welche Lizenz hat dein Code eigentlich?

Keine Einschränkung, Quellenangabe wäre nett.

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Chris schrieb:

> Die Zugriffe auf die IOs

Hmmm...

OneWire war eigentlich als Bussystem gedacht, mit dem primären 
Entwicklungsziel, möglichst wenige Leitungen zu benötigen.

Dein Lösung konterkarriert das doch irgendwie ein wenig, oder?

von Chris (chris-heo)


Lesenswert?

Ob S. schrieb:

> Dein Lösung konterkarriert das doch irgendwie ein wenig, oder?

Das stimmt natürlich, es gibt aber auch Gründe es auf diese Weise zu 
machen:

Die angeschlossenen Sensoren sind einfacher zuordenbar, sprich: man muss 
sich nicht um die Search & Match kümmern und sie können wirklich 
zeitgleich ausgelesen werden (für wen das wichtig ist).

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Chris schrieb:

> Die angeschlossenen Sensoren sind einfacher zuordenbar, sprich: man muss
> sich nicht um die Search & Match kümmern

Nunja. Klar.

> und sie können wirklich
> zeitgleich ausgelesen werden (für wen das wichtig ist).

Ich kann mir nur eine Sache vorstellen, bei der es wichtig wäre, dass 
Temperatur sensoren gleichzeitig ausgelesen werden. Das ist, wenn auch 
der abfragende Controller auf Batterie läuft, und deshalb nur möglichst 
kurze Zeit aktiv sein soll.

Aber klar: Dieses Szenario kann durchaus mal vorkommen. Das sehe ich 
ein.

von Peter D. (peda)


Lesenswert?

Ich habe die Erfahrung gemacht, man sollte die Sensoren nur alle 10s 
auslesen. Ansonsten kann die Eigenerwärmung einen deutlichen Meßfehler 
bewirken, besonders an wenig bewegten Gasen.

: Bearbeitet durch User
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.