ATTiny13: PORTB-Zuweisung funktioniert nicht wie gewünscht.

Gast #5255205
Lesenswert?
• ▲
▼
ATTiny13, Studio 7, keine Optimierung(-O0)

Die IF-Anweisungen sind wahr und die Zuweisungen werden ausgeführt, aber 
PORTB bleibt auf 0x00.

Warum ist das so?
1
#include <avr/io.h>
2
#include <stdfix.h>
3

4
int main(void)
5
{
6
  short _Fract fx1 = 0.9;
7
  short _Fract fx2 = 0.7;
8
  short _Fract fx;
9

10
  fx = fx1 * fx2;
11
  
12
  if (fx > 0.5)
13
  {
14
    PORTB = (uint8_t)fx;
15
  }
16
  
17
  fx = fx + 0.1;
18
  
19
  if (fx > 0.6)
20
  {
21
    PORTB = (uint8_t)fx;
22
  }
23
}
Gast #5255220
Lesenswert?
• ▲
▼
Da musste ich gerade erst einmal googeln, was "short" überhaupt für ein 
Datentyp ist. In 30 Jahren habe ich den noch nie gesehen - was für mich 
schon ein ganz großer Wink mit dem Zaunpfahl ist.

short ist ein also ein Integer mit mindestens 16 Bits.

Ich bin ziemlich sicher, dass man besser mit exakten Größen arbeiten 
sollte. In diesem Fall also uint16_t. Dann ist auch klar, was dabei 
heraus kommt und es ist offensichtlich, dass man darin keine 
Fließkommazahlen speichern kann.

Bei plattform-unabhängigen Code sind noch die fast_xxx Typen 
interessant. Da gibt man die mindeste Größe an die man braucht, und der 
Compiler nimmt ggf. was größeres, wenn der Prozessor damit schneller 
umgehen kann.
#5255224
Lesenswert?
• ▲
▼
Stefan U. schrieb:
> Da musste ich gerade erst einmal googeln, was "short" überhaupt für ein
> Datentyp ist. In 30 Jahren habe ich den noch nie gesehen - was für mich
> schon ein ganz großer Wink mit dem Zaunpfahl ist.

Auf jeden Fall, wer mit C unterwegs ist sollte schon wissen was ein 
short ist ;)
Ist dir das echt noch nie bei C untergekommen? Ich hab das noch vor z.B. 
int8_t gesehen und ich bin auch fast 30 Jahre dabei.
#5255230
Lesenswert?
• ▲
▼
M. K. schrieb:
> Stefan U. schrieb:
>> Da musste ich gerade erst einmal googeln, was "short" überhaupt für ein
>> Datentyp ist. In 30 Jahren habe ich den noch nie gesehen - was für mich
>> schon ein ganz großer Wink mit dem Zaunpfahl ist.
>
> Auf jeden Fall, wer mit C unterwegs ist sollte schon wissen was ein
> short ist ;)
> Ist dir das echt noch nie bei C untergekommen? Ich hab das noch vor z.B.
> int8_t gesehen und ich bin auch fast 30 Jahre dabei.

"short (int)" und "short _Fract" sind ganz unterschiedliche Datentypen.
Gemeinsam haben sie nur, daß sie die jeweils kurze Version ihrer Art 
sind.
#5255231
Lesenswert?
• ▲
▼
Ich sehe kein DDRB im Code - Port B Pins sind dann AFAIK alle Inputs.

Bei allen
1
PORTB = (uint8_t)fx;

.. ist fx jeweils kleiner als 1 und damit PortB immer 0 (Null). C rundet 
nicht, es truncated. Wollte man runden muss man die für _Frakt 
zuständige Funktion aufrufen.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.